Mysql的事务隔离机制

事务——保证多个任务执行是否同时成功或者同时失败。事务支持是在引擎层实现的,Mysql的默认引擎InnoDB是支持事务的,以前的MyISAM是不支持事务的。本文我们主要讨论事务的隔离机制

目录

一、事务的4个特性
二、隔离性和隔离机制
三、事务隔离的实现
四、事务的启动方式


一、事务的4个特性

  • 原子性(atomicity)
    一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性

  • 一致性(consistency)
    事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。

  • 隔离性(isolation)
    事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

  • 持久性(durability)
    一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。–即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态

返回顶部目录


二、隔离性和隔离机制

  • 首先我们得知道隔离的越好,效率就越低,需要结合具体的业务选择合适的隔离性

  • SQL标准的事务隔离机制:

    • 读未提交:一个事务还没有提交前,它做的变更能被别的事务看见
    • 读提交:一个事务提交后,其变更才能被其他事务看见
    • 可重复读:一个事务执行过程中看见的数据,和这个事务在启动时一致(被其他事物修改也没用)。在此机制下,未提交变更对其他事务也是不可见的
    • 串行化:对于数据操作,写会加写锁,读会加读锁。当出现读写锁冲突时,后访问的事务必须等前一个事务执行完成,才能继续执行。
  • 一般我们将Mysql的隔离级别设置为"读提交"

    • 配置方法:将启动参数transaction-isolation的值设置成READ-COMMITTED
  • 可重复读:比如:检查每天的账单余额,用户发生的新交易不影响你的统计结果。

返回顶部目录


三、事务隔离的实现

  • 可重复读的事务隔离的实现
    • 在Mysql中,实际上每条记录在更新的时候同时会记录一条回滚操作。通过回滚操作,都可以得到前一个状态的值
      在这里插入图片描述

    • 当前值为7,但是在查询这条记录的时候,不同时刻启动的事务会有不同视图——9、8、7。存在多个版本,就是数据库的多版本并发控制(MVCC)。对于得到视图A的结果,必须按照执行图的顺序回滚操作得到。

    • 系统会判断,当没有事务需要回滚某日志时,该回滚日志会删除

返回顶部目录


四、事务的启动方式

Mysql的事务启动方式(建议使用方法1):
  • 显示启动事务语句:begin或start transaction。配套的提交语句是commit,回滚语句是rollback。
  • set autocommit=0 ,这个命令会将该线程的自动提交关闭。有些客户端连接框架会默认连接成功后先执行一个set autocommit=0的命令,导致接下来的查询都在事务中,如果是长连接,就会导致意外的长事务。

返回顶部目录

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值