今天在操作mysql數據庫時,犯了一個大錯誤,執行了一個更新語句,但時條件沒寫全,結果在執行了幾秒之后才發現這個問題,將一些不該改變的記錄值改變了。1天時間全部耗在數據恢復上了,于是惡補了mysql中關于自動提交功能及和的內容,在此做一個標記,防止類似事情再次發生!
MySQL的自動提交功能
在MySQL中執行命令時,通常都直接被確定提交了。也就是說用戶不用意識此事,所有的命令都會被自動。特別是當存儲引擎為的情況下,本身它是不支持事務處理的,只要執行了命令,所有的命令部會被提交。
這樣的默認自動提交的功能就被稱為自動提交功能。自動提交功能默認被置為ON的狀態。但是,如果存儲引擎為 ()時,當執行了START 或BEGIN命令(MySQL事務處理-刪除后回滾)后,將不會自動提交了,只有明確執行了命令后才會被提交,在這之前可以執行 命令回滾更新操作。
所有的 DML 語句都是要顯式提交的(=OFF情況下),也就是說要在執行完DML語句之后,執行 。而其他的諸如 DDL語句的,都是隱式提交的。也就是說,在運行那些非 DML 語句后,數據庫已經進行了隱式提交,例如 ,在運行腳本后,表已經建好了,并不在需要你再進行顯式提交。在提交事務()之前可以用回滾事務。
禁用自動提交
方式一、
1、在執行DML語句(inser / / )之前,先執行一個begin;語句,進行了一段時間的數據庫操作之后使用提交所有操作或者使用回滾所有操作
p.s. 方式一要注意,一次或一次表示最近一個begin到此次或之間的操作都將提交或回滾,這之后的操作都必須重新設置begin,否則還會繼續使用=ON的策略。
方式二、
1、登錄mysql數據庫
2、set ='false';
3、查看是否禁用自動提交:""; (如果是OFF表示禁用成功)
4、執行一段 / / 語句,檢查數據無錯誤之后再執行;這樣,這段時間內的所有操作都將提交到數據庫中,如果發現執行了不正確的 / / 語句,則使用,此時將會回滾到上一個之后數據庫的狀態。
mysql中set =0與start 區別
=0,
當前禁用自動提交事物,自此句執行以后,每個DDL語句或者語句塊所在的事務都需要顯示""才能提交事務。
指的是啟動一個新事務。
在默認的情況下,MySQL從自動提交()模式運行,這種模式會在每條語句執行完畢后把它作出的修改立刻提交給數據庫并使之永久化。事實上,這相當于把每一條語句都隱含地當做一個事務來執行。如果你想明確地執行事務自動提交功能設置為啟用時無法回退,需要禁用自動提交模式并告訴MySQL你想讓它在何時提交或回滾有關的修改。
執行事務的常用辦法是發出一條(或BEGIN)語句掛起自動提交模式,然后執行構成本次事務的各條語句,最后用一條 語句結束事務并把它們作出的修改永久性地記入數據庫。萬一在事務過程中發生錯誤,用一條語句撤銷事務并把數據庫恢復到事務開 始之前的狀態。
語句"掛起"自動提交模式的含義是:在事務被提交或回滾之后,該模式將恢復到開始本次事務的 語句被執行之前的狀態。(如果自動提交模式原來是激活的,結束事務將讓你回到自動提交模式;如果它原來是禁用的,結束 當前事務將開始下一個事務。)
如果是模式自動提交功能設置為啟用時無法回退,的值應該為1,不的值是0;請在操作前確定的模式是否開啟