資料庫事務由一組sql語句組成。
所有sql語句執行成功則事務整體成功;任一條sql語句失敗則事務整體失敗,資料恢復到事務之前的狀態。
下面以轉賬為例進一步說明。
a 賬戶向 b 賬戶轉賬,需要更新兩個賬戶的記錄:
- a 賬戶減金額
update user set money=money-100 where id='a'
- b 賬戶加金額
update user set money=money+100 where id='b'
資料操作的最小單元是事務,而不是一條sql語句!
start transaction;
- 或begin;
事務開始後,對資料的增刪改操作不直接修改資料表,而是被記錄在日誌檔案中。
commit;
將日誌中記錄的操作,永久儲存到資料表,並清空日誌檔案。
rollback;
直接清空日誌檔案
create table user (
id int primary key auto_increment,
username varchar(128),
`password` char(32)
) charset=utf8;
# 插入一條資料
insert into `user`(username,`password`) values('aaa', 'aaa');
開啟兩個終端,分別登入資料庫。
# 在終端登入 mysql
mysql -uroot -p
# 切換到你的資料庫
mysql> use 資料庫名;
測試一
測試二
乙個事務是乙個不可分割的工作單元,事務中包括的操作要麼都做,要麼都不做。
資料操作的最小單元是事務,而不是sql語句 。
事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。
例如:乙個事務的執行不能被其他事務干擾。
即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
讀取到其他事務未提交的資料。
事務之間為了避免互相干擾,執行時要進行隔離。也就是a執行時b要等待。但嚴格的隔離會造成效能的下降。
資料庫為了兼顧資料安全和效能,可以在一定程度上允許多個事務並行執行。
mysql 提供了四種隔離級別從低到高:
隔離級別越高資料越安全;越低效能越好,但會造成資料訪問的問題:
# repeatable-read 是mysql預設的隔離級別
set tx_isolation='repeatable-read';
set tx_isolation='serializable';
oracle mysql 8 使用transaction_isolation
系統變數:
set transaction_isolation='read-uncommitted';
set transaction_isolation='read-committed';
# repeatable-read 是mysql預設的隔離級別
set transaction_isolation='repeatable-read';
set transaction_isolation='serializable';
注意:set
設定的變數只對當前會話有效。需要進行全域性設定使用set global
開啟兩個終端,分別登入資料庫。
# 在終端登入 mysql
mysql -uroot -p
# 切換到你的資料庫
mysql> use 資料庫名;
測試一
測試二
測試三
測試四
q.e.d.
本地事務 全域性事務 分布式事務
本地事務 事務隔離級別 select tx isolation tx isolation repeatable read 1 row in set 0.00 sec 開啟事務 執行緒1執行如下。use order db begin update orders set order money orde...
本地事務和分布式事務
1 本地事務acid 和 cap中的ca區別 本地事務 a 原子性 乙個事務中所有操作,要不全部完成,要不全部不完成,事務在執行過程中發生錯誤,會被回滾到事務開始前的狀態,就像這個事務沒有被執行過一樣。c 一致性 事務的一致性指在乙個事務執行之前和執行之後資料庫都必須處於一致性狀態,如果事務成功完成...
分布式事務和本地事務
指一次大的操作由不同的小操作組成的,這些小的操作分布在不同的伺服器上,分布式事務需要保證這些小操作要麼全部成功,要麼全部失敗。從本質上來說,分布式事務就是為了保證不同資料庫的資料一致性。1 資料庫分庫分表 當資料庫單錶一年產生的資料超過1000w,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋...