mysql的事务提交(commit)与回滚(rollback)详解
1.SQL概念
Structured Query Language- - -结构化查询语言
有 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句;
数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句;
数据查询语言(DQL),例如:SELECT语句;
数据控制语言(DCL),例如: COMMIT、ROLLBACK、GRANT、REVOKE等语句
2.COMMIT:提交事务
查看事务状态:select @@autocommit; show variables like ‘%autocommit%’;
1或者ON表示自动提交;0或者OFF表示手动提交:需要commit命令提交事务。
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.06 sec)
设置手动提交:set autocommit=0; set autocommit=OFF;
mysql> set autocommit=0;
Query OK, 0 rows affected (0.02 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)
mysql> set autocommit=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.02 sec)
下面实际演示一下:
首先新开session1并建表create table test_a(id1 int,id2 int);
然后设置手动提交set autocommit=0;(这样设置只对当前session有效,是临时的,如果想要永久全局设置,修改my.cnf文件,添加autocommit=0);
再向表中插入数据insert into test_a values(1,1);
此时新开第二个session2,查询该表select * from test_a;可以发现,此时在session2上是查询不到数据的,原因就是因为在session1的事务还未提交。但是此时在session1是可以查到,这是不是和上述有点矛盾呢,其实不然,未提交的数据会临时写到内存或磁盘(内存不足的情况下),且未提交的数据上有个锁(涉及隔离级别,后续讲解),锁是只有当前事务唯一持有的,所以其他事务取不到,但当前事务是可以读取的。 <这段划重点,可以多理解一下>
接着换一种思路,在session2(自动提交)上插入一条新数据insert into test_a values(2,2);然后去session1查询,发现session1上仍然查不到新增的数据,这里有人会问session2不是设置的自动提交吗,为什么session1查不到数据呢?这是因为当session为非自动提交状态时,自事务开始后的DML操作对其都是不可见的,只有事务结束后才可见。在session1执行commit,就可以查询到新增数据了。
再看第三种情况,在session1新增一条数据,此时在session2查询是查不到新增数据的;此时在session1再新建一张表,再去session2查询,结果发现在session1未执行commit命令的情况下,session2竟然也可以查询到新增数据了。这是因为session1执行了DDL操作,触发了隐式提交事务的规则,所以其他session也可以看到DDL的修改了。但是drop命令有点特殊,如果事务还未结束,drop命令会被阻塞。
3.ROLLBACK:回滚事务
Rollback就是与commit相反,不提交事务,可以理解成撤回的意思
mysql> insert into test_a values(1,1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from test_a;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test_a;
Empty set (0.00 sec)
推荐阅读
-
mysql实现事务的提交与回滚的实例详解
-
关于MySQL中的事务、回滚(rollback)、提交(commit)
-
mysql中的提交(commit)与回滚(rollback)
-
mysql的事务提交(commit)与回滚(rollback)详解
-
mysql实现事务的提交和回滚实例_MySQL
-
mysql实现事务的提交与回滚的实例详解
-
在PHP中 开始事务后,程序抛出异常 没有执行commit也没有执行rollback mysql事务会回滚吗?
-
JDBC_事务概念_ACID特点_隔离级别_提交commit_回滚rollback
-
mysql实现事务的提交和回滚实例_MySQL
-
在PHP中 开始事务后,程序抛出异常 没有执行commit也没有执行rollback mysql事务会回滚吗?