1. 程式人生 > >【php】mysql事務commit自動提交

【php】mysql事務commit自動提交

<span style="font-size:18px;">mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.04 sec)</span>

MySQL預設操作模式就是autocommit自動提交模式。這就表示除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執行。我們可以通過設定autocommit的值改變是否是自動提交autocommit模式。

通過以下命令可以檢視當前autocommit模式

<span style="font-size:18px;">mysql> set autocommit = 0;</span>

從查詢結果中,我們發現Value的值是ON,表示autocommit開啟。我們可以通過以下SQL語句改變這個模式

值0和OFF都是一樣的,當然,1也就表示ON。通過以上設定autocommit=0,則使用者將一直處於某個事務中,直到執行一條commit提交或rollback語句才會結束當前事務重新開始一個新的事務。

舉個例子:

張三給李四轉賬500元。那麼在資料庫中應該是以下操作:

1,先查詢張三的賬戶餘額是否足夠

2,張三的賬戶上減去500元

3,李四的賬戶上加上500元

以上三個步驟就可以放在一個事務中執行提交,要麼全部執行要麼全部不執行,如果一切都OK就commit提交永久性更改資料;如果出錯則rollback回滾到更改前的狀態。利用事務處理就不會出現張三的錢少了李四的賬戶卻沒有增加500元或者張三的錢沒有減去李四的賬戶卻加了500元

MySQL預設的儲存引擎是MyISAM,MyISAM儲存引擎不支援事務處理,所以改變autocommit沒有什麼作用。但不會報錯,所以要使用事務處理的童鞋一定要確定你所操作的表示支援事務處理的,如InnoDB。如果不知道表的儲存引擎可以通過檢視建表語句檢視建表的時候有沒有指定事務型別的儲存引擎,如果沒有指定儲存引擎預設則是MyISAM不支援事務的儲存引擎。

當然,事務處理是為了保障表資料原子性一致性隔離性永續性。這些都是要消耗系統資源的,要謹慎選擇