MySQL數據庫事務transaction示例講解教程
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-0021';
以上兩條DML語句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗。
要想保證以上的兩條DML語句,同時成功或者同時失敗,那麼就需要使用數據庫的
“事務機制”。
2、和事務相關的語句隻有這3個DML語句:insert、delete、update
“為什麼隻有這3個DML語句:insert、delete、update?”
因為它們這三個語句都是和數據庫表中的”數據相關”的。事務的存在是為瞭保證數據的完整性,安全性。
3、假設所有的業務都能使用1條DML語句搞定,還需要事務機制嗎?
不需要事務。
但實際情況不是這樣的,通常一個事兒(“事務”)需要多條DML語句共同聯合完成。
4、事務的原理
註意:
一旦提交事務,就會把歷史操作持久化到硬盤上去,持久化完成後,清空歷史記錄。
一旦回滾事務,就會把歷史記錄直接清空掉,而不持久化到硬盤中。
事務操作,還可以設計保存點:瞭解。
5、事務的四大特性:ACID
事務包括四大特性:ACID
A原子性:事務是最小的工作單元,不可再分。
C一致性:事務必須保證多條DML語句,同時成功或者同時失敗。
I隔離性:事務A與事務B之間具有隔離。
D持久性:持久性指的是最終數據必須持久化到硬盤文件中,事務才算成功結束。
下面對上述事務四大特性,進行一個更為詳細的說明
“原子性”:一組操作要麼都成功,要麼都失敗,這一組操作是不可拆分的。
“一致性”:事務發生前後,數據總額仍然是匹配的。模擬一個人給另外一個人轉賬來說,轉賬之前,2人的金額總和為400;轉賬以後,2人的金額總額仍為400。
“隔離性”:所有操作沒有執行完畢之前,其它會話窗口不能看見中間數據的改變過程,隻有當前窗口可以看見數據改變過程。
“持久性”:一旦commit提交後,事務產生的影響就不能夠撤銷瞭,已經實實在在把數據修改瞭。
6、關於事務之間的隔離性
“事務的隔離性存在隔離級別,理論上隔離級別包括4個”
隔離級別一般都是從2級、3級起步,1級一般用不上。
1)第一級別:讀未提交(read uncommitted)
對方的事務還沒有提交,當前事務可以讀取到對方為提交的數據。
讀未提交存在的問題:”臟讀現象”,表示讀到瞭臟數據。
“臟讀”:指的是一個事務正在修改數據,但是這種修改並沒有提交到數據庫。
而另一個事務,訪問到瞭該數據,此時這個數據屬於【臟數據】,因而叫臟讀。
2)第二級別:讀已提交(read committed)
對方事務提交後的數據,我方可以讀取到。
這種隔離級別解決瞭:臟讀現象沒有瞭。
讀已提交存在的問題:不可重復讀。
3)第三級別:可重復讀(repeatable read)
這種隔離級別解決瞭:不可重復讀問題。
這種級別存在的問題:讀取到的數據是幻想,即讀取的是備份數據。
4)第四級別:序列化讀/串行化讀(serializable)
解決瞭所有問題。
但是效率低,需要事務排隊。
“需要註意的是”
oracle數據庫默認的隔離級別是:讀已提交(第二級別)。
mysq1數據庫默認的隔離級別是:可重復讀(第三級別)。
7、演示事務的隔離級別(演示數據自己造一些)
1)演示事務之前,需要掌握的知識點。
1)mysql默認情況下,事務是自動提交的。 2)什麼是自動提交? 隻要是執行任意一條DML語句,則自動提交一次。 因此,在演示事務之前,必須先關閉自動提交。 "關閉自動提交語句":start transaction; 3)"演示事務需要知道的3條命令:" -- 關閉自動提交事務功能。 start transaction; -- 提交事務。 commit; -- 回滾事務,隻能回滾到上一次的提交點。 rollback;
2)設置全局事務隔離級別。
"設置全局事務隔離級別,設置完成後,退出重新登陸。" -- 設置第一級別 set global transaction isolation level read uncommitted; -- 設置第二級別 set global transaction isolation level read committed; -- 設置第三級別(系統默認的事務級別,不用設置) set global transaction isolation level repeatable read; --設置第四級別 set global transaction isolation level serializable; "查看全局事務隔離級別" mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | REPEATABLE-READ | +-----------------------+ 1 row in set, 1 warning (0.00 sec)
3)演示讀未提交。
首先,設置全局事務隔離級別。
下面進行正式的演示:
4)演示讀已提交
首先,設置全局事務隔離級別。
下面進行正式的演示:
5)演示可重復讀
首先,設置全局事務隔離級別。
下面進行正式的演示:
這個需要註意:
這裡演示的是”可重復讀”,我們在右邊窗口演示事務的一些列過程,左邊窗口
根本無法讀取,左邊窗口讀取到的,始終是原始數據的備份數據。
怎麼理解呢?
你別忘記瞭,左邊窗口,也是開啟事務功能瞭的,start transaction;隻要
是左邊這個窗口的事務功能,沒有結束(commit或者rollback都可以結束事務),那
麼左邊窗口讀取到的,始終是原始數據的備份數據,這就是我們所說的”幻想”。任
憑右邊黑窗口中做瞭任何改變,就算你也提交瞭事務,我左邊窗口,就是看不到。
左邊黑窗口,要怎麼才可以看見這個變化呢?”
隻有左邊這個黑窗口,先結束瞭當前黑窗口的事務,重新再次讀取,就可以看
到數據是真實變化瞭。
6)演示序列化讀
首先,設置全局事務隔離級別。
下面進行正式的演示:
第一幅圖:
當左邊窗口,使用”commit”命令,提交事務以後,我們再看右邊窗口的變化。
以上就是MySQL數據庫事務transaction示例講解教程的詳細內容,更多關於MySQL數據庫事務transaction的資料請關註WalkonNet其它相關文章!