默认事务等级_事务
一、事務(wù)定義
- 事務(wù):一個(gè)最小的不可再分的工作單元;通常一個(gè)事務(wù)對(duì)應(yīng)一個(gè)完整的業(yè)務(wù)(例如銀行賬戶(hù)轉(zhuǎn)賬業(yè)務(wù),該業(yè)務(wù)就是一個(gè)最小的工作單元)
- 一個(gè)完整的業(yè)務(wù)需要批量的DML(insert、update、delete)語(yǔ)句共同聯(lián)合完成
- 事務(wù)只和DML語(yǔ)句有關(guān),或者說(shuō)DML語(yǔ)句才有事務(wù)。這個(gè)和業(yè)務(wù)邏輯有關(guān),業(yè)務(wù)邏輯不同,DML語(yǔ)句的個(gè)數(shù)不同
二、查看事務(wù)語(yǔ)句
只有InnoDB支持事務(wù)
1.查看 mysql 當(dāng)前默認(rèn)的存儲(chǔ)引擎
show variables like '%storage_engine%';
2.查看某張表的存儲(chǔ)引擎
show create table 表名 ;
三、事務(wù)特性
1、原子性(atomicity)
一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小單元, 整個(gè)事務(wù)中的所有操作要么全部提交成功,
要么全部失敗, 對(duì)于一個(gè)事務(wù)來(lái)說(shuō), 不可能只執(zhí)行其中的一部分操作
整個(gè)事務(wù)要么全部成功, 要么全部失敗
2. 一致性(consistency)
一致性是指事務(wù)將數(shù)據(jù)庫(kù)從一種一致性轉(zhuǎn)換到另外一種一致性狀態(tài), 在事務(wù)開(kāi)始之前和事務(wù)
結(jié)束之后數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性沒(méi)有被破壞
例如轉(zhuǎn)賬:A給B轉(zhuǎn)賬,A減去500,B增加500,減少和增加相加應(yīng)該是0
3、持久性(durability)
一旦事務(wù)提交, 則其所做的修改就會(huì)永久保存到數(shù)據(jù)庫(kù)中。 此時(shí)即使系統(tǒng)崩潰, 已經(jīng)提交的
修改數(shù)據(jù)也不會(huì)丟失
并不是數(shù)據(jù)庫(kù)的角度完全能解決
4、隔離性(isolation)
一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。 即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事
務(wù)是隔離的, 并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
(對(duì)數(shù)據(jù)庫(kù)的并行執(zhí)行, 應(yīng)該像串行執(zhí)行一樣)
事務(wù)并發(fā)問(wèn)題:
- 臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
- 不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過(guò)程中,對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果 不一致。
- 幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫(kù)中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒(méi)有改過(guò)來(lái),就好像發(fā)生了幻覺(jué)一樣,這就叫幻讀。
不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問(wèn)題只需鎖住滿(mǎn)足條件的行,解決幻讀需要鎖表
四種隔離級(jí)別:
- 未提交讀(READ UNCOMMITED)
事務(wù)A讀取到事務(wù)B未提交的數(shù)據(jù)
事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
事務(wù)A:
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
begin;
select * from test ;
insert into test(name,age) values ('李四',20);
事務(wù)B:
begin;
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- 已提交讀(READ COMMITED)
set SESSION TRANSACTION ISOLATION LEVEL read committed;
可以讀到已經(jīng)事務(wù)提交的數(shù)據(jù)
不能出現(xiàn)臟讀
- 可重復(fù)讀(REPEATABLE READ)
set SESSION TRANSACTION ISOLATION LEVEL repeatable read;
在同一個(gè)事務(wù)中讀到是同一條數(shù)據(jù),其他事務(wù)修改了讀的也是修改前的數(shù)據(jù)
不能出現(xiàn)臟讀和不可重復(fù)讀
特別注意的是MySQL數(shù)據(jù)庫(kù)在RR隔離級(jí)別時(shí)候也解決了幻讀問(wèn)題
- 可串行化
set SESSION TRANSACTION ISOLATION LEVEL serializable;
在一個(gè)事務(wù)未提交時(shí)候,另外一個(gè)事務(wù)不能對(duì)這個(gè)表的數(shù)據(jù)修改,包括新增、修改、刪除、查詢(xún)
四種隔離級(jí)別對(duì)比:
是:代表能出現(xiàn);否:代表不能出現(xiàn)
MySQL默認(rèn)隔離級(jí)別是repeatable-read
五、語(yǔ)法
1、開(kāi)啟事務(wù)
begin
START TRANSACTION(推薦)
begin work
2、提交
commit;
3、回滾:
rollback;
4、默認(rèn)事務(wù)時(shí)自動(dòng)提交
SHOW VARIABLES LIKE 'autocommit';結(jié)果顯示,autocommit 的值是 ON,表示系統(tǒng)開(kāi)啟自動(dòng)提交模式。
在 MySQL 中,可以使用 SET autocommit 語(yǔ)句設(shè)置事務(wù)的自動(dòng)提交模式,語(yǔ)法格式如下:
SET autocommit = 0|1|ON|OFF;
對(duì)取值的說(shuō)明:
- 值為 0 和值為 OFF:關(guān)閉事務(wù)自動(dòng)提交。如果關(guān)閉自動(dòng)提交,用戶(hù)將會(huì)一直處于某個(gè)事務(wù)中,只有提交或回滾后才會(huì)結(jié)束當(dāng)前事務(wù),重新開(kāi)始一個(gè)新事務(wù)。
- 值為 1 和值為 ON:開(kāi)啟事務(wù)自動(dòng)提交。如果開(kāi)啟自動(dòng)提交,則每執(zhí)行一條 SQL 語(yǔ)句,事務(wù)都會(huì)提交一次。
六、事務(wù)還原點(diǎn)
savepoint
show variables like '%autocommit%'; 自動(dòng)提交事務(wù)是開(kāi)啟的
set autocommit=0;
insert into testdemo values(5,5,5);
savepoint s1;
insert into testdemo values(6,6,6);
savepoint s2;
insert into testdemo values(7,7,7);
savepoint s3;
select * from testdemo
rollback to savepoint s2
rollback
總結(jié)
- 上一篇: 这文字的起始位置_ae制作文字动画?ae
- 下一篇: 启动标志_牛股启动的标志:天衣无缝。