天天看點

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 上看到這個例子,如下圖:

mysql savepoint是什麼_Mysql中的隐式COMMIT以及Savepoints的作用
mysql savepoint是什麼_Mysql中的隐式COMMIT以及Savepoints的作用

看圖上說:是因為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;