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不支持事務的存儲引擎。
當然,事務處理是為了保障表數據原子性、一致性、隔離性、持久性。這些都是要消耗系統資源的,要謹慎選擇。