1、什么是事務
一個事務是一個完整的業務邏輯單元,不可再分,
比如:銀行轉賬,從A賬戶向B賬務轉賬10000,需要執行兩條update陳述句
update t_act set balance = balance - 10000 where actno = 'act-001' ; update t_act set balance = balance + 10000 where actno = 'act-002' ;
以上兩條DML陳述句必須同時成功,或同時失敗,不允許一條成功,一條失敗!
想要保證以上的兩條DML陳述句(update、insert、delete)同時成功或者同時失敗,那么就需要使用資料庫的“事務機制” !

2、事務原理
假設一個事兒,需要先執行一條insert,再執行一條update,最后執行一條delete,這個事兒才算完成,
開啟事務機制(開始)
- 執行insert陳述句–>insert.(這個執行成功之后,把這個執行記錄到資料庫的操作歷史當中,并不會向檔案中保存-條資料,不會真正的修改硬碟上的資料,)
- 執行update陳述句—> update…(這個執行也是記錄一下歷史操作,不會真正的修改硬碟上的資料)
- 執行delete陳述句---->delete…(這個執行也是記錄一下歷史操作【記錄到快取】,不會真正的修改硬碟上的資料)
提交事務或者回滾事務(結束)
怎么提交事務,怎么回滾事務?
提交事務:commit;陳述句
回滾事務:rollback;陳述句==(回滾永遠都是只能回到上次事務的提交點!)==
MySQL默認的事務行為是怎么樣的?
MySQL默認情況下是支持自動提交事務的,(自動提交):就是一條DML提交一次!
怎么樣才能將MySQL的自動提交事務關閉呢?
先執行如下命令:start transaction ,開啟事務,也是將自動提交事務關閉!
在次命令后的指定的DML陳述句并不會持久化到資料庫,等待commit | rollback 操作!
3、事務的特性:ACID
A:原子性(atomicity):事務是最小的作業單元,不可再分,
C:一致性(consistency):事務必須保證多條DML陳述句同時成功或同時失敗,
I :隔離性(isolation):事務A與事務B之間具有隔離,
D:持久性(durability):持久性說的時最終的資料必須持久化道硬碟檔案中,事務才算成功的結束,
4、事務的隔離性
將事務A與事務B分別比作教室A,B,然而它們之間的墻就是隔離性,墻越厚隔離級別越高!(這種墻分為四個級別)
- 第一級別:讀未提交(read uncommitted):我們當前事務可以讀取對方未提交的事務,
- 存在問題:存在臟讀(Dirty read)現象,表示讀到了臟的資料,
- 第二級別:讀已提交(read committed):我們當前事務可讀取對方已提交的事務,解決了臟讀現象,存在問題:不可重復讀,
- 第三級別:可重復讀(repeatable read):解決不可重復讀,永遠讀取到的都是開啟事務時的資料,==存在問題:讀取到的資料是幻像(幻讀)==例如:執行一條查詢的sql需要從1點3點,那么這條sql讀取的一直是1點的資料,即使13點之間存在其他操作,該sql的結果并不會受到影響,類似快照,一直讀取的是快照中的資料,
- 第四級別:序列化讀/串行化讀(serializable):解決了所有問題, 效率低,需要事務排隊(類似于synchronized),
Oracle資料庫默認級別:第二級別;讀已提交
Mysql資料庫默認級別:第三級別,可重復讀
5、驗證各種隔離級別
對以上各種隔離級別做一個驗證
通過命令 select @@tx_isolation;查看當前事物的隔離級別 ! +-------------------+ | @@tx_isolation | +-------------------+ | REPEATABLE-READ | +-------------------+
讀未提交(read uncommitted):
#執行如下命令,設定全域的事務隔離級別為讀未提交 set global transaction isolation level read uncommitted;

讀已提交(read committed):
測驗 讀已提交(read committed)
#執行如下命令,設定全域的事務隔離級別為讀已提交 set global transaction isolation level read committed;

可重復讀(repeatable read):
測驗:可重復讀(repeatable read)
#執行如下命令,設定全域的事務隔離級別為可重復讀 set global transaction isolation level read committed;

序列化讀/串行化讀(serializable):
測驗 序列化讀/串行化讀(serializable)
#執行如下命令,設定全域的事務隔離級別為可重復讀 set global transaction isolation level serializable;

本文來自博客園,作者:腹白,轉載請注明原文鏈接:https://www.cnblogs.com/wyh518/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/520714.html
標籤:MySQL
上一篇:約束
下一篇:存盤引擎
