一、MYSQL 的交易處理機制
參考博文 : MYSQL的交易處理功能 深入淺出mysql交易處理和鎖機制 MySQL交易處理和鎖定語句
簡單介紹一下事務:
事務一般要滿足4個條件:
原子性:事務在執行時,要做到“要麼全做,要麼不做”。也就是說不允許事務部分執行。即使因為故障而使事務不能完成,在rollback時也要消除對資料庫的影響。
一致性: 事務的操作應該使資料庫從一個一致性的狀態變到另一個一致性的狀態。例如網上購物,只有既讓商品出庫,又讓商品進入客戶的購物籃才能構成事務。
隔離性: 如果多個事務並發執行,應像各個事務獨立執行一樣。
持久性: 一個成功執行的事務對資料庫的作用是持久的,即使資料庫因故障出錯,也應該能夠恢複。
(PS)MYSQL 中只有 InnoDB 和 BDB 類型才能支援交易處理,其他類型不支援。
mysql 的交易處理機制主要有兩種:
第一種是:以 BEGIN , ROLLBACK, COMMIT 來實現。建議使用這種方法來處理。
step1:BEGIN 開始一個事務
step2:執行mysql 語句,檢測是否執行成功。
step3:檢測失敗就執行 ROLLBACK ,進行交易回復
step4:按照事務需求,重複運行step2,3。
step5:COMMIT 事務確認。
// 下面代碼在mysql控制台上測試回合過,沒問題
mysql> use test;Database changedmysql> CREATE TABLE `dbtest`( -> id int(4) -> ) TYPE=INNODB;Query OK, 0 rows affected, 1 warning (0.05 sec)mysql> select * from dbtest -> ;Empty set (0.01 sec)mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> insert into dbtest value(5);Query OK, 1 row affected (0.00 sec)mysql> insert into dbtest value(6);Query OK, 1 row affected (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)mysql> select * from dbtest;+------+| id |+------+| 5 || 6 |+------+2 rows in set (0.00 sec)mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> insert into dbtest values(7);Query OK, 1 row affected (0.00 sec)mysql> rollback;Query OK, 0 rows affected (0.00 sec)mysql> select * from dbtest;+------+| id |+------+| 5 || 6 |+------+2 rows in set (0.00 sec)mysql>
/** * 下面代碼是在php上的類似實現 */$handler=mysql_connect("localhost","root","");mysql_select_db("task");mysql_query("BEGIN");//開始事務定義mysql_query('START TRANSACTION');if(!mysql_query("insert into trans (id) values('2')")){mysql_query("ROOLBACK");//判斷當執行失敗時復原}if(!mysql_query("insert into trans (id) values('4')")){mysql_query("ROOLBACK");//判斷執行失敗復原}mysql_query("COMMIT");//執行事務mysql_close($handler);
第二種是直接用 SET 來改變mysql 的自動認可模式
mysql 是預設自動認可的,即我們提交一個query,它就直接執行。我們可以通過
SET AUTOCOMMIT = 0 ; 禁止自動認可
SET AUTOCOMMIT = 1 ; 開啟自動認可
來實現交易處理。
要注意的是: 用 set autocommit=0 的時候,你以後所有的SQL都將做為事務處理,直到你用commit確認或rollback結束,注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為一個事務!所以推薦用第一種方法。