事务ACID理解复习
談到事務一般都是以下四點
原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
一致性(Consistency)
事務前后數據的完整性必須保持一致。
隔離性(Isolation)
事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響
舉個簡單的例子理解以上四點
原子性
針對同一個事務
這個過程包含兩個步驟
A: 800 - 200 = 600
B: 200 + 200 = 400
原子性表示,這兩個步驟一起成功,或者一起失敗,不能只發生其中一個動作
一致性(Consistency)
針對一個事務操作前與操作后的狀態一致
操作前A:800,B:200
操作后A:600,B:400
一致性表示事務完成后,符合邏輯運算
持久性(Durability)
表示事務結束后的數據不隨著外界原因導致數據丟失
操作前A:800,B:200
操作后A:600,B:400
如果在操作前(事務還沒有提交)服務器宕機或者斷電,那么重啟數據庫以后,數據狀態應該為
A:800,B:200
如果在操作后(事務已經提交)服務器宕機或者斷電,那么重啟數據庫以后,數據狀態應該為
A:600,B:400
隔離性(Isolation)
針對多個用戶同時操作,主要是排除其他事務對本次事務的影響
兩個事務同時進行,其中一個事務讀取到另外一個事務還沒有提交的數據,B
事務的隔離級別
臟讀:
指一個事務讀取了另外一個事務未提交的數據。
###不可重復讀:
在一個事務內讀取表中的某一行數據,多次讀取結果不同。(這個不一定是錯誤,只是某些場合不對)
頁面統計查詢值
點擊生成報表的時候,B有人轉賬進來300(事務已經提交)
虛讀(幻讀)
是指在一個事務內讀取到了別的事務插入的數據,導致前后讀取不一致。
(一般是行影響,多了一行)
四種隔離級別設置
####數據庫
set transaction isolation level 設置事務隔離級別
select @@tx_isolation?? ?查詢當前事務隔離級別
####java
適當的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation
mysql模擬事務隔離性測試
SELECT @@session.tx_isolation; SELECT @@tx_isolation; SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted; SET SESSION TRANSACTION ISOLATION LEVEL read committed; SET SESSION TRANSACTION ISOLATION LEVEL repeatable read; SET SESSION TRANSACTION ISOLATION LEVEL serializable; start transaction;--建表 drop table AMOUNT; CREATE TABLE `AMOUNT` ( `id` varchar(10) NULL, `money` numeric NULL ) ; --插入數據 insert into amount(id,money) values('A', 800); insert into amount(id,money) values('B', 200); insert into amount(id,money) values('C', 1000); --測試可重復讀,插入數據 insert into amount(id,money) values('D', 1000);--設置事務 SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted; SELECT @@tx_isolation; --開啟事務 start transaction;--臟讀演示,讀到其他事務未提交的數據 --案列1,事務一:A向B轉200,事務二:查看B金額變化,事務一回滾事務 update amount set money = money - 200 where id = 'A'; update amount set money = money + 200 where id = 'B';--不可重復讀演示,讀到了其他事務提交的數據 --案列2,事務一:B向A轉200,事務二:B向C轉200轉100 SET SESSION TRANSACTION ISOLATION LEVEL read committed; --開啟事務 start transaction; --兩個事務都查一下數據(轉賬之前需要,查一下金額是否夠滿足轉賬) select * from amount; --事務一:B向A轉200 update amount set money = money - 200 where id = 'B'; update amount set money = money + 200 where id = 'A';commit; --事務二:B向C轉200轉100 update amount set money = money - 100 where id = 'B'; update amount set money = money + 100 where id = 'C'; commit; --從事務二的角度來看,讀到了事務一提交事務的數據,導致金額出現負數--幻讀演示 --案列3,事務一:B向A轉200,事務二:B向C轉200轉100 SET SESSION TRANSACTION ISOLATION LEVEL repeatable read; --開啟事務 start transaction; --兩個事務都查一下數據(轉賬之前需要,查一下金額是否夠滿足轉賬) select * from amount; --事務一:B向A轉200 update amount set money = money - 200 where id = 'B'; update amount set money = money + 200 where id = 'A';commit; --事務二:B向C轉200轉100 update amount set money = money - 100 where id = 'B'; update amount set money = money + 100 where id = 'C'; commit; --從事務二的角度來看,讀到了事務一提交事務的數據,導致金額出現負數?
- serializable事務二會一直等著事務一提交再操作
?
?
總結
以上是生活随笔為你收集整理的事务ACID理解复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DM8168评估板上供电电源的设计
- 下一篇: DM8168学习--引导顺序