Mybatis学习(三)之事务控制

mybatis事务控制的分析

什么是事务?

百度百科的解释:
Mybatis学习(三)之事务控制
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。

事务的四大特性 ACID

数据库事务 transanction 正确执行的四个基本要素。
ACID:

  • 原子性(Atomicity):事务是一个原子操作单元,事务中包含的所有操作要么都做,要么都不做,没有第三种情况。
  • 一致性(Correspondence):事务操作前和操作后都必须满足业务规则约束,比如说A向B转账,转账前和转账后AB两个账户的总金额必须是一致的。
  • 隔离性(Isolation):隔离性是数据库允许多个并发事务同时对数据进行读写的能力,隔离性可以防止事务并发执行时由于交叉执行导致数据不一致的问题。
  • 持久性(Durability):事务完成后,对数据的修改是永久的,即使出现系统故障也不会丢失。

安全性问题:不考虑隔离性会产生的问题

更新丢失:当两个事务选择同一行,然后更新数据,由于每个事务都不知道其他事务的存在,就会发生丢失更新的问题,(你我同时读取同一行数据,进行修改,你commit之后我也commit,那么我的结果将会覆盖掉你的结果)。

脏读(Drity Read):一个事务正在对一条记录做修改,在这个事务提交之前,别的事务读取到了这个事务修改之后的数据,也就是说,一个事务读取到了其他事务还没有提交的数据,就叫做脏读。

不可重复读(Non-repeatable read):一个事务读某条数据读两遍,读到的是不一样的数据,也就是说,一个事务在进行中读取到了其他事务对旧数据的修改结果,(比如说 我开一个事务 修改某条数据 先查后改 执行修改动作的时候发现这条数据已经被别的事务删掉了)

幻读(Phantom Read):一个事务中,读取到了其他事务新增的数据,仿佛出现了幻象。(幻读与不可重复读类似,不可重复读是读到了其他事务update/delete的结果,幻读是读到了其他事务insert的结果)

解决方法:四种隔离级别

1.未提交读(read-uncommitted)
在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。

2.已提交读(read-committed)
在一个事务中,可以读取到其他事务已经提交的数据变化,这种读取也就叫做不可重复读,因为两次同样的查询可能会得到不一样的结果。

3.可重复读(repetable-read)
MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。

4.可串行化(serializable)
这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。

隔离级别一览表
Mybatis学习(三)之事务控制
隔离级别越严格,内部工作机制越复杂,较松散的隔离级别通常可以支持更高的并发。
Mybatis学习(三)之事务控制

mybatis中的事务

它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚
Mybatis学习(三)之事务控制