autocommit是一個改變事務提交方式參數,設定為1時,所有改變變的立即生效,也就是說為1時,語句執行完後,事務自動認可。如果設定為0時,需要通過commit或者rollback進行提交或者復原事務。 糾正一種說法就是,set autocommit = 0時,會自動開啟一個事務,準確來說是set autocommit = 0時下一個語句會自動開啟一個事務。 set autocommit = 0與start transaction的區別: 前者下改變事務提交方式,是自動認可還是非自動認可,設定時不會導致前面的事務隱性提交; 後者是立即開啟一個事務,並隱性提交前面的事務
set autocommit = 1 與 commit 的區別 兩者都可以提交前面的事務,但在5.0、5.1的版本中會不一樣,具體可以看下bug#54462
另外比較重要的點需要注意: python使用MySQLdb串連mysql資料庫時,autocommit預設會設定成OFF的,每個sql進來後,都需要主動commit來提交事務。代碼中設定成ON,如果需要開一個事務,通過start transaction方式來開啟。
舉個例子:
張三給李四轉賬500元。那麼在資料庫中應該是以下操作:
1,先查詢張三的賬戶餘額是否足夠
2,張三的賬戶上減去500元
3,李四的賬戶上加上500元
以上三個步驟就可以放在一個事務中執行提交,要麼全部執行要麼全部不執行,如果一切都OK就commit提交永久性更改資料;如果出錯則rollback復原到更改前的狀態。利用交易處理就不會出現張三的錢少了李四的賬戶卻沒有增加500元或者張三的錢沒有減去李四的賬戶卻加了500元。
MySQL預設的儲存引擎是MyISAM,MyISAM儲存引擎不支援交易處理,所以改變autocommit沒有什麼作用。但不會報錯,所以要使用交易處理的童鞋一定要確定你所操作的表示支援交易處理的,如InnoDB。如果不知道表的儲存引擎可以通過查看建表語句查看建表的時候有沒有指定事務類型的儲存引擎,如果沒有指定儲存引擎預設則是MyISAM不支援事務的儲存引擎。
當然,交易處理是為了保障表資料原子性、一致性、隔離性、持久性。這些都是要消耗系統資源的,要謹慎選擇。