mysql savepoint是什么_Mysql中的隐式COMMIT以及Savepoints的作用
Mysql默認是自動提交的,如果要開啟使用事務,首先要關閉自動提交后START TRANSACTION 或者 BEGIN 來開始一個事務,使用ROLLBACK/COMMIT來結束一個事務。但即使如此,也并不是所有的操作都能被ROLLBACK,以下語句在執行后會導致回滾失效,比如DDL語句創建一個數據庫,而且不止此,這樣的語句包括以下這些等:
ALTER FUNCTION,ALTER PROCEDURE,ALTER TABLE,BEGIN,CREATE DATABASE,CREATE FUNCTION,CREATE INDEX,CREATE PROCEDURE,CREATE TABLE,DROP DATABASE,DROP FUNCTION,DROP INDEX,DROP PROCEDURE,DROP TABLE,LOAD MASTER DATA,LOCK TABLES,RENAME TABLE,SET AUTOCOMMIT=1,START TRANSACTION,TRUNCATE TABLE,UNLOCK TABLES,CREATE TABLE,CREATE DATABASE DROP DATABASE,TRUNCATE TABLE,ALTER FUNCTION,ALTER PROCEDURE,CREATE FUNCTION,CREATE PROCEDURE,DROP FUNCTION和DROP PROCEDURE...
這些語句(以及同義詞)均隱含地結束一個事務,即在執行本語句前,它已經隱式進行了一個COMMIT。InnoDB中的CREATE TABLE語句被作為一個單一事務進行處理。所以ROLLBACK不會撤銷用戶在事務處理過程中操作的CREATE TABLE語句。另外上面的語句中包括START TRANSACTION,這即是說明事務不能被嵌套。事物嵌套會隱式進行COMMIT,即一個事務開始前即會把前面的事務默認進行提交。
在這個頁面 https://blog.csdn.net/qingsong3333/article/details/77018567 上看到這個例子,如下圖:
看圖上說:是因為CREATE語句已經隱式地commit了。之后的語句都是自動提交的。我就感覺這里有問題,自己試了一下,果真是有問題,如下命令:
#執行SQL命令setautocommit=0;start transaction;create table teachers(id int AUTO_INCREMENT,tname varchar(50),PRIMARY KEY (id));INSERT INTO students(username)VALUES('lisi');rollback;#執行結果:[SQL]setautocommit=0;受影響的行:0時間:0.001s[SQL]start transaction;受影響的行:0時間:0.000s[SQL]create table teachers(id int AUTO_INCREMENT,tname varchar(50),PRIMARY KEY (id));受影響的行:0時間:0.171s[SQL]INSERT INTO students(username)VALUES('lisi');受影響的行:1時間:0.001s[SQL]rollback;受影響的行:0時間:0.126s
上面的在執行過程中,ROLLBACK雖然不能撤回create table語句,但是數據插入行是會回滾的(表students數據未增加,但自增字段會增加1)。真不知道它的結論是怎么來的,誤導人啊,真捉急!!真捉急!!
總之關于START TRANSACTION 和autocommit,
1.不管autocommit 是1還是0,START TRANSACTION 后,只有當commit數據才會生效,ROLLBACK后就會回滾(不能回滾的DDL語句等除外)。
2.當autocommit 為 0 時,不管有沒有START TRANSACTION。只有當commit數據才會生效,ROLLBACK后就會回滾。
3.如果autocommit 為1,并且沒有START TRANSACTION。調用ROLLBACK是沒有用的。即便設置了SAVEPOINT。
上面談到了設置SAVEPOINT, savepoint正如其字面意思,保存點,在事務中可以設定保存點,回滾的時候可以自由定義回滾至某個保存點,而不用一定要回滾到事務開始的時候的數據狀態,官方介紹:保存點(savepoint)是事務過程中的一個邏輯點,用于取消部分事務,當結束事務時,會自動的刪除該事務中所定義的所有保存點。當執行rollback時,通過指定保存點可以回退到指定的點。如下示例一看便懂。
setautocommit =0;start transaction;INSERT INTO students(username)VALUES('haha');SAVEPOINT tempa;INSERT INTO students(username)VALUES('haha_2');ROLLBACK TO SAVEPOINT tempa;#此處使用不使用RELEASE都可以,會自動刪除RELEASE SAVEPOINT tempa;COMMIT;
總結
以上是生活随笔為你收集整理的mysql savepoint是什么_Mysql中的隐式COMMIT以及Savepoints的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm连接远程mysql_Cen
- 下一篇: MYSQL中的主表和父表_主表,从表,关