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