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