Mysql 事务隔离

概念

  • 事务支持是在引擎层实现的,MyISAM不支持事务,而InnoDB支持。
  • 事务性质:ACID(Atomicity,Consistency,Isolation,Durability),即原子性、一致性、隔离性和持久性。

隔离性与隔离级别。

  • 数据库上有多个事务执行,可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)。为了解决这些问题,就有了隔离级别的概念。
  • 隔离的越严实,效率就会越低。所以我们需要在二者间寻找一个平衡点。
  • SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。
  • 读未提交是指:一个事务还未提交,它所做的修改就能被其他事务看到。(这个隔离级别会产生脏读的问题:修改被其他事务看到后,本事务回滚了。)
  • 读提交是指:事务提交后,所做修改才能被其他事务看到。(这个隔离级别会产生不可重复读问题:本事务提交前和提交后,其他事务读到的结果逻辑不一致。)
  • 可重复读是指:在一次事务中,这个事务看到的数据总是和启动时是一致的。(这个隔离级别会产生幻读的问题:SELECT了3条数据,UPDATE的时候可能返回了4个成功结果,或者INSERT某条不在的数据时忽然报错说唯一索引冲突等。需要通过加锁解决。)
  • 串行化是指:对于同一行记录,读会加读锁,写会加写锁,后访问的事务需要等前一事务提交后,才能继续执行。

隔离级别实现

  • 数据库会创建一个视图,访问的时候以视图逻辑结果为准。
  • 可重复读隔离级别下,视图是在事务启动时创建的,整个事务存在期间都使用这个视图。
  • 读提交隔离级别下,视图是在每个SQL语句开始执行前创建的。
  • 读未提交级别下,直接返回记录上最新值,没有视图概念;而串行化级别下直接使用加锁避免并行访问。

事务隔离实现

  • 每一条记录在更新时都会记录一条回滚操作,记录上的最新的值,通过回滚,可以得到前一个状态的值。
  • 假设一个值被从1改成4,则在回滚日志(undo log)中会有以下记录。(以下内容来自Mysql45讲03)-
  • 可重复读隔离级别下,不同时刻启动的事务有不同的的read-view。在视图A、B、C里,记录值分别为1,2,4。同一条记录在系统中有多个存在版本,这就是数据库的多版本并发控制(MVCC)
  • 当没有事务需要这些回滚日志时,回滚日志会被删除。(没有比这个回滚日志更早的read-view,我理解比如事务A提交了,那么read-viewA也就没用了,将2改成1这个回滚操作也就没用了)
  • 长事务意味着系统里会存在很老的事务试图,这个事务提交前,他可能用到的回滚记录都必须保留,会导致大量占用存储空间(除了回滚段的影响,长事务还占用锁资源)。

事务启动方式

  • 显式启动:begin,commit,rollback
  • 当 set autocommit=0,会将线程的自动提交关掉,随意执行一条sql就会启动事务,直到主动执行commit或rollback。
  • 建议一直保持set autocommit=1。
  • 为了不每次启动事务都执行begin,可以使用commit work and chain。即
begin;
commit work and chain;
commit work and chain;
...
...
commit;
  • 可以在 information_schema 库的 innodb_trx 这个表中查询长事务,比如下面这个语句,用于查找持续时间超过 60s 的事务。
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值