前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql四种事务隔离级别

mysql四种事务隔离级别

作者头像
johnhuster的分享
发布2022-03-29 14:22:52
2980
发布2022-03-29 14:22:52
举报
文章被收录于专栏:johnhuster

说到数据库,必然离不开事务模型,mysql也不例外,笔者在看到网上一些文章后发现网上蛮多文章写得不太属实,所以决定在这里写一篇文章做一些补充,力求做到真实可追究:

说到事务,必谈两个东西:事务的传递性以及隔离级别,虽然传递性这个东西跟mysql本身没有多大关系,但在实际使用中比如spring中使用了mysql数据库,spring就提供了以下几种事务传递性:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED

这里就不再细谈spring的事务传递性,感兴趣的可以自己深入研究下,看下这几种传递性的不同之处,下面就以mysql的innodb存储引擎(以下简称mysql)为例来看下数据库的事务隔离级别(不同数据库不同存储引擎都可能不一样,比如mysql的memory、myisam等非事务存储引擎就不支持事务)。

mysql的事务隔离级别有以下四种:

1.读未提交,有两个事务:事务A与事务B,事务A里面更新了一条记录并且未提交,事务B可以读取到事务A未提交的更改,一般不用,如果事务B使用了事务A未提交的更改,并在此基础上做了运算,并更改了数据库,事务A如果事务回滚,将会导致数据的不一致(存在脏读问题)。

2.读提交,这是很多数据库默认的事务隔离级别,但是不是mysql事务的默认隔离级别,这种隔离级别可以解决脏读的问题,但是无法解决可重复读以及幻读问题,两个事务:事务A与事务B,事务A更新了某条记录并提交,事务B在事务A操作该数据之前读取一次数据,然后在事务A更新该数据并提交后再读一次,读到的结果不一样(也称不可重复读)。

3.可重复读,两个事务:事务A与事务B,事务A更新了某条记录并提交,事务B在事务A操作该数据之前读取一次数据,然后在事务A更新该数据并提交后再读一次,读到的结果一样。针对这种隔离级别,网上很多资料都说存在幻读的情况,其他数据库可能如此,但是mysql的innodb存储引擎却通过多版本并发控制解决了幻读这个问题,笔者在实际测试过程中发现如果事务A插入或者删除数据,事务B仅仅执行select操作,不执行insert、update等更改数据的操作,那么就不存在幻读的问题,否则就会存在幻读问题,但是笔者认为这也不是典型的幻读操作了吧,毕竟执行了write操作

4.串行读,最高的事务隔离级别,在实际生产环境很少使用,因为这种隔离级别应对高并发方面性能远远不足!!

通用数据库的事务隔离级别如下图所示,请注意mysql在可重复读下幻读可能性的不同之处(不存在write操作的话就可以避免幻读)

欢迎跟帖讨论!

注:感兴趣的可以通过navicat验证下,会用到的几个命令:

1.set global tx_isolation='READ-COMMITED';-(读提交)--READ-COMMITED必须为大写

2.begin或者start transaction;开始事务

3.commit;事务提交

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/07/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档