事务回滚分析(详解)
@@autocommit作用:设置自动提交
如果该变量打开,MYSQL会认为每一条语句都是事务,会自动提交
(将@@autocommit关闭,防止误操作,造成数据库数据的丢失损坏)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)
事务回滚实例:
开启一个事务,进行相关操作1,设置一个保存点A,再进行操作2,设置保存点B,再进行操作3,此时进行查看,看到的是操作3之后的结果,进行事务回滚保存点B
rollback to B;
此时查看,看到的结果是操作2 的结果,再 回滚保存点A
rollback to A;
看到的是操作1的结果,如果直接进行回滚,
rollback;
进行查看,看到的是操作1 的结果
具体操作如下:
1、开启一个事务
start transaction;
2、执行相关操作
(在当前会话查看t1表中数据,给表中插入数据,再查看表中数据)
注意在其他会话查看不到当前会话修改的数据
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
+------+------+
1 row in set (0.00 sec)
mysql> insert into t2 values(2,'b');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
+------+------+
2 rows in set (0.01 sec)
3、设置一个保存点aa
mysql> savepoint aa;
Query OK, 0 rows affected (0.00 sec)
4、再向表中插入数据
mysql> insert into t2 values(3,'c');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.00 sec)
5、设置保存点bb
mysql> savepoint bb;
Query OK, 0 rows affected (0.00 sec)
6、再插入数据
mysql> insert into t2 values(4,'d');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+------+------+
4 rows in set (0.00 sec)
7、回滚保存点bb,查看结果如下图所示:
mysql> rollback to bb;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.00 sec)