mysql-事務

事務

什麼是事務:
數據庫事務:(database transaction): 事務是由一組SQL語句組成的邏輯處理單元,要不全成功要不全失敗。
※ MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型不支持!
事務處理:可以確保非事務性單元的多個操作都能成功完成,否則不會更新數據資源。
數據庫默認事務是自動提交的, 也就是發一條 sql 它就執行一條。如果想多條 sql 放在一個事務中執行,則需要使用事務進行處理。當我們開啓一個事務,並且沒有提交,mysql 會自動回滾事務。或者我們使用 rollback 命令手動回滾事務。
優點:通過將一組操作組成一個,執行時,要麼全部成功,要麼全部失敗的單元。
使程序更可靠,簡化錯誤恢復。
例:
•A匯款給B 1000元
•A賬戶-1000
•B賬戶+1000
•以上操作對應數據庫爲兩個update。這兩個操作屬於一個事物。否則,可能會出現A賬戶錢少了,B賬戶錢沒增加的情況。

事務四大特性:

事務是必須滿足4個條件(ACID)
1、原子性(Autmic):事務在執行性,要做到“要麼不做,要麼全做!”,就是說不允許事務部分得執行。即使因爲故障而使事務不能完成,在rollback時也要消除對數據庫得影響!
2、一致性(Consistency):事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。在事務開始之前和結束之後,數據庫的完整性約束沒有被破壞
3、 隔離性(Isolation):一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾,這些通過鎖來實現。
4、 持久性(Durability):指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障(比如說宕機等)不應該對其有任何影響。
事務的ACID特性可以確保銀行不會弄丟你的錢,而在應用邏輯中,要實現這點非常難,甚至可以說是不可能完成的任務。

MySQL事務處理的方法:

1、用BEGIN,ROLLBACK,COMMIT來實現

START TRANSACTION | BEGIN [WORK]  開啓事務
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 提交當前事務,執行永久操作。
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 回滾當前事務到開始點,取消上一次開始點後的所有操作。
SAVEPOINT 名稱   折返點

2、直接用set來改變mysql的自動提交模式

   MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!
 SET AUTOCOMMIT = {0 | 1} 設置事務是否自動提交,默認是自動提交的。
0:禁止自動提交
1:開啓自動提交。
※ MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持!
mysql> set autocommit=0;  禁止事務自動提交
mysql> delimiter //        修改結束符
mysql> start transaction;  創建事務
    -> update books set bName="ccc" where bId=1;
    -> update books set bName="ddd" where bId=2;
-> commit;//   提交,一旦提交無法回滾

測試,查看是否完成修改:
mysql> select bName from books where bId=1 or bId=2;//
在這裏插入圖片描述
數據庫存儲引擎是否爲innodb
mysql> show create table books//\G
在這裏插入圖片描述
爲MyISAM無法成功啓動事務,雖然提交了,卻無法回滾
修改數據庫存儲引擎爲innodb

mysql> alter table books engine=innodb;
mysql> alter table category engine=innodb;

在這裏插入圖片描述
在這裏插入圖片描述
重新開啓事務,並測試回滾

mysql> set autocommit=0;
mysql> delimiter //
mysql> start transaction;
    -> update books set bName="HA" where bId=1;
    -> update books set bName="LB" where bId=2;
-> commit;//
mysql> delimiter ;

在這裏插入圖片描述
無法回滾,因爲我們commit已經提交了

mysql> delimiter //
mysql> start transaction; update books set bName="AH" where bId=1; update books set bName="BL" where bId=2;//  不提交
mysql> delimiter ;

在這裏插入圖片描述

回滾:

mysql> rollback;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章