MySQL的事務處理具有ACID的特性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
1. 原子性指的是事務中所有操作都是原子性的,要么全部完成,要么全部不完成。這意味著事務執行過程中的任何錯誤都會導致事務回滾到開始前的狀態,所有操作就像沒有發生一樣。
原子性體現如下:
假設有一張賬號表,現在要進行轉賬操作(從zhangsan賬號轉1000元到lisi賬號)
沒有事務控制的情況下,操作應該如下
update account set money=money-1000 where name='zhangsan';update account set money=money+1000 where name='lisi';
如果在處理的過程中出錯了,那么可能就會導致數據只更新了一般,比如
update account set money=money-1000 where name='zhangsan';
出錯了...update account set money=money+1000 where name='lisi';
由于“出錯了...”不是sql語句,應該執行到“出錯了...”就會拋錯,導致
update account set money=money+1000 where name='lisi'; 沒有被執行。
因此就會發現錢丟了1000元。最終結果就會變成
造成這個結果的原因如下:
(1)mysql的事務是自動提交的, 可以使用select @@autocommit進行查看
@@autocommit=1表示事務是自動提交的;
(2)這兩個sql語句分別是兩個單獨的事務,應該當執行完第一個語句的時候,中間出錯了,那么第一個語句的結果已經被提交了,而第二個語句沒有被執行到。
update account set money=money-1000 where name='zhangsan';
出錯了...update account set money=money+1000 where name='lisi';
解決上面問題的方式有兩種,一是將事務改為手動提交,二是開啟事務,具體的解決方式如下
(1)事務改為手動提交
set @@autocommit=0;update account set money=money-1000 where name='zhangsan';
出錯了...update account set money=money+1000 where name='lisi';
當sql出錯時,進行rollback回滾,就不會提交事務了。
(2)開啟事務
start transaction;update account set money=money-1000 where name='zhangsan';
出錯了...update account set money=money+1000 where name='lisi';
當sql出錯時,不提交事務,進行rollback回滾,同樣可以保證事務的原子性。
以上就是事務的原子性,后續文章將進行一致性、隔離性、持久性的學習。