mysql事務(wù)號怎么生成 mysql事務(wù)命令

MySql可以創(chuàng)建事務(wù) (可以請給個例子)

function func($val,$id) {

創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計與制作經(jīng)驗,為許多企業(yè)提供了網(wǎng)站定制設(shè)計服務(wù),案例作品覆蓋雨棚定制等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身策劃品質(zhì)網(wǎng)站。

$sql="update table set a=? where id=?";

$pre=$this-pdo-prepare($sql);

$this-pdo-beginTransaction();//開啟事務(wù)

$bo=$pre-execute(array($val,$id));

if($bo){

//…執(zhí)行代碼……

$this-pdo-commit();//提交事務(wù)

return true;

}else{

//…執(zhí)行代碼……

$this-pdo-rollBack();//回滾事務(wù)

return false;

}

}

關(guān)于 mysql 事務(wù)中的自增 id 的疑問

id 自增,name 為字符串類型

table 依然為空,開啟事務(wù)后在沒有commit的情況下,是沒有修改 table 的。

這里將事務(wù) b 直接提交

由于事物 b 提交了,插入了一行數(shù)據(jù),id 為 2,所以這里生成 id 是在插入的時候。

這個時候開始提交事物a

事務(wù) a 和 b 都提交成功,上一個事務(wù)a的插入的數(shù)據(jù)項也出現(xiàn)了。

由于事物 c 回滾,事物 d 提交成功,所以 table 中確實是少了一行數(shù)據(jù)。

自增 id,是在插入的時候就已經(jīng)生成了,事務(wù)并不影響 id 的自增。

如果事務(wù)回滾,table 對應(yīng)的數(shù)據(jù)行就會缺失,id 也會缺失,自增 id 和事務(wù)是獨立的,互不影響。

數(shù)據(jù)庫的事務(wù)機(jī)制是什么

回答的有點多請耐心看完。

希望能幫助你還請及時采納謝謝

1事務(wù)的原理

事務(wù)就是將一組SQL語句放在同一批次內(nèi)去執(zhí)行,如果一個SQL語句出錯,則該批次內(nèi)的所有SQL都將被取消執(zhí)行。MySQL事務(wù)處理只支持InnoDB和BDB數(shù)據(jù)表類型。

1事務(wù)的ACID原則

** 1(Atomicity)原子性**: 事務(wù)是最小的執(zhí)行單位,不允許分割。原子性確保動作要么全部完成,要么完全不起作用;

2(Consistency)一致性: 執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致;

3(Isolation)隔離性: 并發(fā)訪問數(shù)據(jù)庫時,一個事務(wù)不被其他事務(wù)所干擾。

4(Durability)持久性: 一個事務(wù)被提交之后。對數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的,即使數(shù)據(jù)庫發(fā)生故障。

1緩沖池(Buffer Pool)

Buffer Pool中包含了磁盤中部分?jǐn)?shù)據(jù)頁的映射。當(dāng)從數(shù)據(jù)庫讀取數(shù)據(jù)時,會先從Buffer Pool中讀取數(shù)據(jù),如果Buffer Pool中沒有,則從磁盤讀取后放入到Buffer Pool中。當(dāng)向數(shù)據(jù)庫寫入數(shù)據(jù)時,會先寫入到Buffer Pool中,Buffer Pool中更新的數(shù)據(jù)會定期刷新到磁盤中(此過程稱為刷臟)。

2日志緩沖區(qū)(Log Buffer)

當(dāng)在MySQL中對InnoDB表進(jìn)行更改時,這些更改命令首先存儲在InnoDB日志緩沖區(qū)(Log Buffer)的內(nèi)存中,然后寫入通常稱為重做日志(redo logs)的InnoDB日志文件中。

3雙寫機(jī)制緩存(DoubleWrite Buffer)

Doublewrite Buffer是共享表空間的物理文件的 buffer,其大小是2MB.是一個一分為二的2MB空間。

刷臟操作開始之時,先進(jìn)行臟頁**‘備份’**操作.將臟頁數(shù)據(jù)寫入 Doublewrite Buffer.

將Doublewrite Buffer(順序IO)寫入磁盤文件中(共享表空間) 進(jìn)行刷臟操作.

4回滾日志(Undo Log)

Undo Log記錄的是邏輯日志.記錄的是事務(wù)過程中每條數(shù)據(jù)的變化版本和情況.

在Innodb 磁盤架構(gòu)中Undo Log 默認(rèn)是共享表空間的物理文件的Buffer.

在事務(wù)異常中斷,或者主動(Rollback)回滾的過程中 ,Innodb基于 Undo Log進(jìn)行數(shù)據(jù)撤銷回滾,保證數(shù)據(jù)回歸至事務(wù)開始狀態(tài).

5重做日志(Redo Log)

Redo Log通常指的是物理日志,記錄的是數(shù)據(jù)頁的物理修改.并不記錄行記錄情況。(也就是只記錄要做哪些修改,并不記錄修改的完成情況) 當(dāng)數(shù)據(jù)庫宕機(jī)重啟的時候,會將重做日志中的內(nèi)容恢復(fù)到數(shù)據(jù)庫中。

1原子性

Innodb事務(wù)的原子性保證,包含事務(wù)的提交機(jī)制和事務(wù)的回滾機(jī)制.在Innodb引擎中事務(wù)的回滾機(jī)制是依托 回滾日志(Undo Log) 進(jìn)行回滾數(shù)據(jù),保證數(shù)據(jù)回歸至事務(wù)開始狀態(tài).

2那么不同的隔離級別,隔離性是如何實現(xiàn)的,為什么不同事物間能夠互不干擾? 答案是 鎖 和 MVCC。

3持久性

基于事務(wù)的提交機(jī)制流程有可能出現(xiàn)三種場景.

1 數(shù)據(jù)刷臟正常.一切正常提交,Redo Log 循環(huán)記錄.數(shù)據(jù)成功落盤.持久性得以保證

2數(shù)據(jù)刷臟的過程中出現(xiàn)的系統(tǒng)意外導(dǎo)致頁斷裂現(xiàn)象 (部分刷臟成功),針對頁斷裂情況,采用Double write機(jī)制進(jìn)行保證頁斷裂數(shù)據(jù)的恢復(fù).

3數(shù)據(jù)未出現(xiàn)頁斷裂現(xiàn)象,也沒有刷臟成功,MySQL通過Redo Log 進(jìn)行數(shù)據(jù)的持久化即可

4一致性

從數(shù)據(jù)庫層面,數(shù)據(jù)庫通過原子性、隔離性、持久性來保證一致性

2事務(wù)的隔離級別

Mysql 默認(rèn)采用的 REPEATABLE_READ隔離級別 Oracle 默認(rèn)采用的 READ_COMMITTED隔離級別

臟讀: 指一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù)。

不可重復(fù)讀: 在一個事務(wù)內(nèi)讀取表中的某一行數(shù)據(jù),多次讀取結(jié)果不同

虛讀(幻讀): 是指在一個事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致。

2基本語法

-- 使用set語句來改變自動提交模式

SET autocommit = 0; /*關(guān)閉*/

SET autocommit = 1; /*開啟*/

-- 注意:

--- 1.MySQL中默認(rèn)是自動提交

--- 2.使用事務(wù)時應(yīng)先關(guān)閉自動提交

-- 開始一個事務(wù),標(biāo)記事務(wù)的起始點

START TRANSACTION

-- 提交一個事務(wù)給數(shù)據(jù)庫

COMMIT

-- 將事務(wù)回滾,數(shù)據(jù)回到本次事務(wù)的初始狀態(tài)

ROLLBACK

-- 還原MySQL數(shù)據(jù)庫的自動提交

SET autocommit =1;

-- 保存點

SAVEPOINT 保存點名稱 -- 設(shè)置一個事務(wù)保存點

ROLLBACK TO SAVEPOINT 保存點名稱 -- 回滾到保存點

RELEASE SAVEPOINT 保存點名稱 -- 刪除保存點

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/*

課堂測試題目

A在線買一款價格為500元商品,網(wǎng)上銀行轉(zhuǎn)賬.

A的銀行卡余額為2000,然后給商家B支付500.

商家B一開始的銀行卡余額為10000

創(chuàng)建數(shù)據(jù)庫shop和創(chuàng)建表account并插入2條數(shù)據(jù)

*/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `shop`;

CREATE TABLE `account` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(32) NOT NULL,

`cash` DECIMAL(9,2) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)

VALUES('A',2000.00),('B',10000.00)

-- 轉(zhuǎn)賬實現(xiàn)

SET autocommit = 0; -- 關(guān)閉自動提交

START TRANSACTION; -- 開始一個事務(wù),標(biāo)記事務(wù)的起始點

UPDATE account SET cash=cash-500 WHERE `name`='A';

UPDATE account SET cash=cash+500 WHERE `name`='B';

COMMIT; -- 提交事務(wù)

# rollback;

SET autocommit = 1; -- 恢復(fù)自動提交

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

3事務(wù)實現(xiàn)方式-MVCC

1什么是MVCC

MVCC是mysql的的多版本并發(fā)控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是為了實現(xiàn)事務(wù)的隔離性,通過版本號,避免同一數(shù)據(jù)在不同事務(wù)間的競爭,你可以把它當(dāng)成基于多版本號的一種樂觀鎖。當(dāng)然,這種樂觀鎖只在事務(wù)級別為RR(可重復(fù)讀)和RC(讀提交)生效。MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不沖突,極大的增加了系統(tǒng)的并發(fā)性能。

2MVCC的實現(xiàn)機(jī)制

InnoDB在每行數(shù)據(jù)都增加兩個隱藏字段,一個記錄創(chuàng)建的版本號,一個記錄刪除的版本號。

在多版本并發(fā)控制中,為了保證數(shù)據(jù)操作在多線程過程中,保證事務(wù)隔離的機(jī)制,降低鎖競爭的壓力,保證較高的并發(fā)量。在每開啟一個事務(wù)時,會生成一個事務(wù)的版本號,被操作的數(shù)據(jù)會生成一條新的數(shù)據(jù)行(臨時),但是在提交前對其他事務(wù)是不可見的;對于數(shù)據(jù)的更新(包括增刪改)操作成功,會將這個版本號更新到數(shù)據(jù)的行中;事務(wù)提交成功,新的版本號也就更新到了此數(shù)據(jù)行中。這樣保證了每個事務(wù)操作的數(shù)據(jù),都是互不影響的,也不存在鎖的問題。

3MVCC下的CRUD

SELECT:

當(dāng)隔離級別是REPEATABLE READ時select操作,InnoDB每行數(shù)據(jù)來保證它符合兩個條件:

** 1 事務(wù)的版本號 大于等于 創(chuàng)建行版本號**

  ** 2 行數(shù)據(jù)的刪除版本 未定義 或者大于 事務(wù)版本號**

  【行創(chuàng)建版本號 事務(wù)版本號 行刪除版本號】

 

INSERT:

InnoDB為這個新行 記錄 當(dāng)前的系統(tǒng)版本號。

DELETE:

InnoDB將當(dāng)前的系統(tǒng)版本號 設(shè)置為 這一行的刪除版本號。

UPDATE:

InnoDB會寫一個這行數(shù)據(jù)的新拷貝,這個拷貝的版本為 當(dāng)前的系統(tǒng)版本號。它同時也會將這個版本號 寫到 舊行的刪除版本里。

————————————————

版權(quán)聲明:本文為CSDN博主「@Autowire」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:

分享文章:mysql事務(wù)號怎么生成 mysql事務(wù)命令
文章起源:http://muchs.cn/article44/ddcjche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、建站公司、網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航外貿(mào)網(wǎng)站建設(shè)、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)