【lesson27】MySQL事务常见操作方式

文章目录

  • 事务提交方式
  • 查看默认事务的隔离级别
  • 读未提交
    • 修改隔离级别
    • 测试隔离级别
  • 事务自动提交问题
  • 单条SQL和事务的关系
  • 结论

事务提交方式

事务的提交方式常见的有两种:

  • 自动提交
  • 手动提交

查看mysql事务提交方式:
【lesson27】MySQL事务常见操作方式_第1张图片
用 SET 来改变 MySQL 的自动提交模式:
#SET AUTOCOMMIT=0 禁止自动提交
【lesson27】MySQL事务常见操作方式_第2张图片
#SET AUTOCOMMIT=1 开启自动提交
【lesson27】MySQL事务常见操作方式_第3张图片

查看默认事务的隔离级别

【lesson27】MySQL事务常见操作方式_第4张图片
我们发现默认事务的隔离级别是可重复读( repeatable read )

读未提交

修改隔离级别

我们隔离级别把设置成读未提交( Read uncommitted )
在这里插入图片描述
我们查看一下是否更改成功:
【lesson27】MySQL事务常见操作方式_第5张图片
我们发现并未更改成功啊,这是为什么?
因为我们更改的事务隔离级别,只有在下一次mysql开启时才会生效。
所以我们重启mysql后,再查看
【lesson27】MySQL事务常见操作方式_第6张图片

测试隔离级别

我们打开两个窗口,并且用同一个数据库。来观察不同事务隔离级别之间的特点。
【lesson27】MySQL事务常见操作方式_第7张图片
建测试表
【lesson27】MySQL事务常见操作方式_第8张图片
我们看一下有几个链接mysql服务的:
【lesson27】MySQL事务常见操作方式_第9张图片
两个连接其实就是我们开启的两个窗口。

开始启动事务:

//两个启动事务的指令,随便选一个
start transaction;//启动事务
begin;//启动事务

【lesson27】MySQL事务常见操作方式_第10张图片
【lesson27】MySQL事务常见操作方式_第11张图片
【lesson27】MySQL事务常见操作方式_第12张图片

【lesson27】MySQL事务常见操作方式_第13张图片
这其实正常因为我们还没插入数据嘛!
【lesson27】MySQL事务常见操作方式_第14张图片
【lesson27】MySQL事务常见操作方式_第15张图片
【lesson27】MySQL事务常见操作方式_第16张图片
【lesson27】MySQL事务常见操作方式_第17张图片
【lesson27】MySQL事务常见操作方式_第18张图片
【lesson27】MySQL事务常见操作方式_第19张图片
【lesson27】MySQL事务常见操作方式_第20张图片
【lesson27】MySQL事务常见操作方式_第21张图片
结束事务
【lesson27】MySQL事务常见操作方式_第22张图片

新一轮测试:
开启事务:
在这里插入图片描述
【lesson27】MySQL事务常见操作方式_第23张图片
【lesson27】MySQL事务常见操作方式_第24张图片
【lesson27】MySQL事务常见操作方式_第25张图片
从图中我们可知,如果事务1不设置保存点,那么回滚指令会直接回滚到事务最初始的状态。

那么这是就有个问题了,已经提交了的事务回滚有用吗
【lesson27】MySQL事务常见操作方式_第26张图片
从图中其实可以看出来,已经提交的回滚没用,rollback只在事务运行期间有效,已经结束了的无效

事务自动提交问题

我们之前学到事务,有两种提交方式,其中mysql默认为自动提交,那么真的是如此吗?
开启事务前:
1.查看是否开启自动提交
2.查看account表的初始数据
【lesson27】MySQL事务常见操作方式_第27张图片
演示:
开启事务
在这里插入图片描述
【lesson27】MySQL事务常见操作方式_第28张图片
我们手动Ctrl+\让事务1异常退出,然后再事务2查看account的数据,我们会发现我们发生异常之前的数据没有插入进去,mysql会自动回滚。

再次测试:
如果我们已经提交了数据,这时候事务异常了会怎么样?
提交数据
【lesson27】MySQL事务常见操作方式_第29张图片
异常退出
【lesson27】MySQL事务常见操作方式_第30张图片
我们会发现数据还在,因为commit之前可以回滚,commit之后不可以。

【lesson27】MySQL事务常见操作方式_第31张图片
我们从目前的测试begin并没有自动提交数据,这是为什么呢
因为手动开启的事务必须手动提交。begin或者start transaction在开启事务时,会自动更改提交方式。

单条SQL和事务的关系

查看提交方式
【lesson27】MySQL事务常见操作方式_第32张图片
设置窗口0提交方式为手动提交
【lesson27】MySQL事务常见操作方式_第33张图片
窗口1查看account表初始数据
【lesson27】MySQL事务常见操作方式_第34张图片
窗口0:启动事务1
【lesson27】MySQL事务常见操作方式_第35张图片
不开启事务,用单条SQL语句删除数据,那么单条SQL语句就是一个事务。
【lesson27】MySQL事务常见操作方式_第36张图片
当mysql异常退出。
【lesson27】MySQL事务常见操作方式_第37张图片
这时我们发现,就算mysql异常退出,窗口1的mysql还是会看到id=4的数据。
这是为什么呢?
因为不开启事务,单条SQL语句就是一个事务,而我们开启了手动提交。那么mysql异常退出,数据将会被回滚。

那么如果我们把它改成,自动提交呢?
【lesson27】MySQL事务常见操作方式_第38张图片
【lesson27】MySQL事务常见操作方式_第39张图片
我们可以看到这回数据就算mysql异常退出也还是被删了,因为我们设置了自动提交。

没有启动事务,那么单条SQL语句就是一个事务,如果自动提交开启那么删除了就是删除了。

结论

结论:

  • 只要输入begin或者starttransaction,事务便必须要通过commit提交,才会持久化,与是否设置setautocommit无关
  • 事务可以手动回滚,同时当操作异常,MySQL会自动回滚
  • 对于 InnoDB 每一条 SQL语言都默认封装成事务,自动提交。(select有特殊情况,因为 MySQL 有MVCC )
  • 从上面的例子,我们能看到事务本身的原子性(回滚),持久性(commit)
  • 那么隔离性?一致性?

事务操作注意事项

  • 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)
  • 如果一个事务被提交了(commit),则不可以回退(rollback) 可以选择回退到哪个保存点
  • InnoDB 支持事务, MyISAM 不支持事务
  • 开始事务可以使用 start transaction 或者 begin

你可能感兴趣的:(MySQL,mysql,数据库)