MySQL數(shù)據(jù)庫(kù)事務(wù)transaction示例講解教程
1、什么是事務(wù)?

一個(gè)事務(wù)是一個(gè)完整的業(yè)務(wù)邏輯單元,不可再分。
比如:銀行賬戶轉(zhuǎn)賬,從A賬戶向B賬戶轉(zhuǎn)賬10000,需要執(zhí)行兩條update語(yǔ)句:
update t_act set balance=balance-10000 where actno='act-001'; update t_act set balance=balance+10000 where actno='act-0021';
以上兩條DML語(yǔ)句必須同時(shí)成功,或者同時(shí)失敗,不允許出現(xiàn)一條成功,一條失敗。
要想保證以上的兩條DML語(yǔ)句,同時(shí)成功或者同時(shí)失敗,那么就需要使用數(shù)據(jù)庫(kù)的
“事務(wù)機(jī)制”。
2、和事務(wù)相關(guān)的語(yǔ)句只有這3個(gè)DML語(yǔ)句:insert、delete、update
“為什么只有這3個(gè)DML語(yǔ)句:insert、delete、update?”
因?yàn)樗鼈冞@三個(gè)語(yǔ)句都是和數(shù)據(jù)庫(kù)表中的"數(shù)據(jù)相關(guān)"的。事務(wù)的存在是為了保證數(shù)據(jù)的完整性,安全性。
3、假設(shè)所有的業(yè)務(wù)都能使用1條DML語(yǔ)句搞定,還需要事務(wù)機(jī)制嗎?
不需要事務(wù)。
但實(shí)際情況不是這樣的,通常一個(gè)事兒(“事務(wù)”)需要多條DML語(yǔ)句共同聯(lián)合完成。
4、事務(wù)的原理

注意:
一旦提交事務(wù),就會(huì)把歷史操作持久化到硬盤上去,持久化完成后,清空歷史記錄。
一旦回滾事務(wù),就會(huì)把歷史記錄直接清空掉,而不持久化到硬盤中。
事務(wù)操作,還可以設(shè)計(jì)保存點(diǎn):了解。
5、事務(wù)的四大特性:ACID

事務(wù)包括四大特性:ACID
A原子性:事務(wù)是最小的工作單元,不可再分。
C一致性:事務(wù)必須保證多條DML語(yǔ)句,同時(shí)成功或者同時(shí)失敗。
I隔離性:事務(wù)A與事務(wù)B之間具有隔離。
D持久性:持久性指的是最終數(shù)據(jù)必須持久化到硬盤文件中,事務(wù)才算成功結(jié)束。
下面對(duì)上述事務(wù)四大特性,進(jìn)行一個(gè)更為詳細(xì)的說明
“原子性”:一組操作要么都成功,要么都失敗,這一組操作是不可拆分的。
“一致性”:事務(wù)發(fā)生前后,數(shù)據(jù)總額仍然是匹配的。模擬一個(gè)人給另外一個(gè)人轉(zhuǎn)賬來(lái)說,轉(zhuǎn)賬之前,2人的金額總和為400;轉(zhuǎn)賬以后,2人的金額總額仍為400。
“隔離性”:所有操作沒有執(zhí)行完畢之前,其它會(huì)話窗口不能看見中間數(shù)據(jù)的改變過程,只有當(dāng)前窗口可以看見數(shù)據(jù)改變過程。
“持久性”:一旦commit提交后,事務(wù)產(chǎn)生的影響就不能夠撤銷了,已經(jīng)實(shí)實(shí)在在把數(shù)據(jù)修改了。
6、關(guān)于事務(wù)之間的隔離性
"事務(wù)的隔離性存在隔離級(jí)別,理論上隔離級(jí)別包括4個(gè)"
隔離級(jí)別一般都是從2級(jí)、3級(jí)起步,1級(jí)一般用不上。
1)第一級(jí)別:讀未提交(read uncommitted)
對(duì)方的事務(wù)還沒有提交,當(dāng)前事務(wù)可以讀取到對(duì)方為提交的數(shù)據(jù)。
讀未提交存在的問題:"臟讀現(xiàn)象",表示讀到了臟數(shù)據(jù)。
"臟讀":指的是一個(gè)事務(wù)正在修改數(shù)據(jù),但是這種修改并沒有提交到數(shù)據(jù)庫(kù)。
而另一個(gè)事務(wù),訪問到了該數(shù)據(jù),此時(shí)這個(gè)數(shù)據(jù)屬于【臟數(shù)據(jù)】,因而叫臟讀。
2)第二級(jí)別:讀已提交(read committed)
對(duì)方事務(wù)提交后的數(shù)據(jù),我方可以讀取到。
這種隔離級(jí)別解決了:臟讀現(xiàn)象沒有了。
讀已提交存在的問題:不可重復(fù)讀。
3)第三級(jí)別:可重復(fù)讀(repeatable read)
這種隔離級(jí)別解決了:不可重復(fù)讀問題。
這種級(jí)別存在的問題:讀取到的數(shù)據(jù)是幻想,即讀取的是備份數(shù)據(jù)。
4)第四級(jí)別:序列化讀/串行化讀(serializable)
解決了所有問題。
但是效率低,需要事務(wù)排隊(duì)。
"需要注意的是"
oracle數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別是:讀已提交(第二級(jí)別)。
mysq1數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別是:可重復(fù)讀(第三級(jí)別)。
7、演示事務(wù)的隔離級(jí)別(演示數(shù)據(jù)自己造一些)
1)演示事務(wù)之前,需要掌握的知識(shí)點(diǎn)。
1)mysql默認(rèn)情況下,事務(wù)是自動(dòng)提交的。 2)什么是自動(dòng)提交? 只要是執(zhí)行任意一條DML語(yǔ)句,則自動(dòng)提交一次。 因此,在演示事務(wù)之前,必須先關(guān)閉自動(dòng)提交。 "關(guān)閉自動(dòng)提交語(yǔ)句":start transaction; 3)"演示事務(wù)需要知道的3條命令:" -- 關(guān)閉自動(dòng)提交事務(wù)功能。 start transaction; -- 提交事務(wù)。 commit; -- 回滾事務(wù),只能回滾到上一次的提交點(diǎn)。 rollback;
2)設(shè)置全局事務(wù)隔離級(jí)別。
"設(shè)置全局事務(wù)隔離級(jí)別,設(shè)置完成后,退出重新登陸。" -- 設(shè)置第一級(jí)別 set global transaction isolation level read uncommitted; -- 設(shè)置第二級(jí)別 set global transaction isolation level read committed; -- 設(shè)置第三級(jí)別(系統(tǒng)默認(rèn)的事務(wù)級(jí)別,不用設(shè)置) set global transaction isolation level repeatable read; --設(shè)置第四級(jí)別 set global transaction isolation level serializable; "查看全局事務(wù)隔離級(jí)別" mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | REPEATABLE-READ | +-----------------------+ 1 row in set, 1 warning (0.00 sec)
3)演示讀未提交。
首先,設(shè)置全局事務(wù)隔離級(jí)別。

下面進(jìn)行正式的演示:
4)演示讀已提交
首先,設(shè)置全局事務(wù)隔離級(jí)別。

下面進(jìn)行正式的演示:

5)演示可重復(fù)讀
首先,設(shè)置全局事務(wù)隔離級(jí)別。

下面進(jìn)行正式的演示:

這個(gè)需要注意:
這里演示的是"可重復(fù)讀",我們?cè)谟疫叴翱谘菔臼聞?wù)的一些列過程,左邊窗口
根本無(wú)法讀取,左邊窗口讀取到的,始終是原始數(shù)據(jù)的備份數(shù)據(jù)。
怎么理解呢?
你別忘記了,左邊窗口,也是開啟事務(wù)功能了的,start transaction;只要
是左邊這個(gè)窗口的事務(wù)功能,沒有結(jié)束(commit或者rollback都可以結(jié)束事務(wù)),那
么左邊窗口讀取到的,始終是原始數(shù)據(jù)的備份數(shù)據(jù),這就是我們所說的"幻想"。任
憑右邊黑窗口中做了任何改變,就算你也提交了事務(wù),我左邊窗口,就是看不到。
左邊黑窗口,要怎么才可以看見這個(gè)變化呢?"
只有左邊這個(gè)黑窗口,先結(jié)束了當(dāng)前黑窗口的事務(wù),重新再次讀取,就可以看
到數(shù)據(jù)是真實(shí)變化了。
6)演示序列化讀
首先,設(shè)置全局事務(wù)隔離級(jí)別。

下面進(jìn)行正式的演示:
第一幅圖:

當(dāng)左邊窗口,使用"commit"命令,提交事務(wù)以后,我們?cè)倏从疫叴翱诘淖兓?/p>

以上就是MySQL數(shù)據(jù)庫(kù)事務(wù)transaction示例講解教程的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)庫(kù)事務(wù)transaction的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信