Mysql基础(三):事务提交与回滚详解

您所在的位置:网站首页 mysql回滚事物 Mysql基础(三):事务提交与回滚详解

Mysql基础(三):事务提交与回滚详解

2024-07-14 11:56| 来源: 网络整理| 查看: 265

目录

1、SQL

2、COMMIT:提交事务

2.1、查看事务状态:

2.2、Mysql事物commit之后无法回滚,未commit可以回滚

2.3、多个session的提交回滚

1、首先新开session1并建表

2、在session2(自动提交)上插入一条新数据

个人理解

3、再看第三种情况

1、SQL

有 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句; 数据操作语言(DML),例如:INSERT、UPDATE、DELETE、SELECT语句; 数据控制语言(DCL),例如: COMMIT、ROLLBACK、GRANT、REVOKE等语句

2、COMMIT:提交事务 2.1、查看事务状态:

select @@autocommit; show variables like ‘%autocommit%’;

1或者ON表示自动提交;0或者OFF表示手动提交:需要commit命令提交事务。 设置手动提交:

set autocommit=0; set autocommit=OFF;

2.2、Mysql事物commit之后无法回滚,未commit可以回滚 start TRANSACTION; delete from user where uid= 1; COMMIT; --提交 ROLLBACK; -- 此时回滚无效 ----------------------------------------------- start TRANSACTION; delete from user where uid= 1; ROLLBACK; -- 此时回滚有效 2.3、多个session的提交回滚 1、首先新开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是可以查到,这是不是和上述有点矛盾呢,其实不然,未提交的数据会临时写到内存或磁盘(内存不足的情况下),且未提交的数据上有个锁,锁是只有当前事务唯一持有的,所以其他事务取不到,但当前事务是可以读取的。

2、在session2(自动提交)上插入一条新数据

insert into test_a values(2,2);

然后去session1查询,发现session1上仍然查不到新增的数据。

这里有人会问session2不是设置的自动提交吗,为什么session1查不到数据呢?

这是因为当session为手动提交状态时,自事务开始后的DML操作对其都是不可见的,只有事务结束后才可见。在session1执行commit,就可以查询到新增数据了。

个人理解

只要未提交,那么一是看不到其他session提交的内容;二是其他session看不到他提交的内容。

3、再看第三种情况

在session1新增一条数据,此时在session2查询是查不到新增数据的;

此时在session1再新建一张表,再去session2查询,结果发现在session1未执行commit命令的情况下,session2竟然也可以查询到新增数据了。

这是因为session1执行了DDL操作,触发了隐式提交事务的规则,所以其他session也可以看到DDL的修改了。但是drop命令有点特殊,如果事务还未结束,drop命令会被阻塞。

原文链接:https://blog.csdn.net/weixin_43639512/article/details/84304672



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3