MySQL—事务及其特征
例子1:
舉一個例子來進行說明,例如轉賬操作:A賬戶要轉賬給B賬戶,那么A賬戶上減少的錢數和B賬戶上增加的錢數必須一致,也就是說A賬戶的轉出操作和B賬戶的轉入操作要么全部執行,要么全不執行;如果其中一個操作出現異常而沒有執行的話,就會導致賬戶A和賬戶B的轉入轉出金額不一致的情況,事實上這種情況是不允許發生的,所以為了防止這種情況的發生,需要使用事務處理。
例子2:
在淘寶購物下訂單的時候,商家庫存要減少,訂單增加記錄,付款我的賬號少100元…操作要么全部執行,要么全不執行
一、事務的概念:
事務(Transaction)指的是一個操作序列,該操作序列中的多個操作要么都做,要么都不做,是一個不可分割的工作單位,是數據庫環境中的邏輯工作單位
二、事務的特性
事務處理可以確保除非事務性序列內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要么全部成功要么全部失敗的序列,可以簡化錯誤恢復并使應用程序更加可靠。
但并不是所有的操作序列都可以稱為事務,這是因為一個操作序列要成為事務,必須滿足事務的原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。這四個特性簡稱為ACID特性。
1)原子性
原子是自然界最小的顆粒,具有不可再分的特性。事務中的所有操作可以看做一個原子,事務是應用中不可再分的最小的邏輯執行體。使用事務對數據進行修改的操作序列,要么全部執行,要么全不執行。通常,某個事務中的操作都具有共同的目標,并且是相互依賴的。如果數據庫系統只執行這些操作中的一部分,則可能會破壞事務的總體目標,而原子性消除了系統只處理部分操作的可能性。
2) 一致性
一致性是指事務執行的結果必須使數據庫從一個一致性狀態,變到另一個一致性狀態。當數據庫中只包含事務成功提交的結果時,數據庫處于一致性狀態。一致性是通過原子性來保證的。例如:在轉賬時,只有保證轉出和轉入的金額一致才能構成事務。也就是說事務發生前和發生后,數據的總額依然匹配。
3) 隔離性
隔離性是指各個事務的執行互不干擾,任意一個事務的內部操作對其他并發的事務,都是隔離的。也就是說:并發執行的事務之間既不能看到對方的中間狀態,也不能相互影響。
例如:在轉賬時,只有當A賬戶中的轉出和B賬戶中轉入操作都執行成功后才能看到A賬戶中的金額減少以及B賬戶中的金額增多。并且其他的事務對于轉賬操作的事務是不能產生任何影響的。
4)持久性
持久性指事務一旦提交,對數據所做的任何改變,都要記錄到永久存儲器中,通常是保存進物理數據庫,即使數據庫出現故障,提交的數據也應該能夠恢復。但如果是由于外部原因導致的數據庫故障,如硬盤被損壞,那么之前提交的數據則有可能會丟失。
三、sql展示:使用事務保證轉賬安全
創建賬戶表:
create table account(id int primary key auto_increment,uname varchar(10) not null,balance double );查看賬戶表
select * from account插入數據
insert into account values(null,'kb',2000),(null,'kd',2000)kb給kd轉賬200元
update account set balance=balance-200 where id=1; update account set balance=balance+200 where id=2;同時執行上面2條sql語句,運行結果:符合邏輯
默認一個DML語句是一個事務,所以上面的操作執行了2個事務
怎么判斷是不是一個事務呢?第二條sql語句錯誤
運行結果:id=1的賬戶錢憑空消失了
必須讓上面的2個操作控制在一個事務中
開啟事務
start transaction update account set balance=balance-200 where id=1; update account set balance=balance+200 where id=2;手動回滾:剛才操作全部取消
ROLLBACK;手動提交
commit在回滾和提交之前,數據庫中的數據都是操作的緩沖中的數據,而不是數據庫真實的數據
總結
以上是生活随笔為你收集整理的MySQL—事务及其特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL—事务并发问题
- 下一篇: MySQL—事务隔离级别