Spring事务隔离 && 事务传播

半腔热情 提交于 2020-03-30 13:59:57
事务的四个属性:
1:原子性(Atomic)
  • 最重要的原则,也是最容易理解的原则。被事务管理的所有方法,要么一起被提交,要么一起回滚。
2:一致性(Consistency)
  • 事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
3:隔离性(Isolation)
  • 在处理一个事务的时候,如果有一个事务同时处理,必须等待这个事务处理完毕,才能进行下一次处理。
4:持久性(Durability)
  • 持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。应该存在一些检查点防止在系统失败时丢失信息。甚至硬件本身失败,系统的状态仍能通过在日志中记录事务完成的任务进行重建。举例:在执行事务的时候,突然停电,等再来电的时候,有个事务记录通知重新执行下这个事务 。
并发问题:

 

  • 脏读:(一个事务读取了未提交的事务)指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
  • 不可重复读:(同一个事务中多次读取同一个数据返回的结果不同 )指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。
  • 幻觉读:(一个事务读取到了另一个事务已提交的insert数据)指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

 

 

ISOLATION_DEFAULT:使用数据库默认的隔离级别

事务隔离级别:

加锁读 serializable, mysql默认可重复读
 
ISOLATION_DEFAULT:使用数据库默认的隔离级别
事务并发处理: 
  • 共享锁:共享锁用于读取数据操作,它允许其他事务同时读取某锁定的资源,但不允许其他事务更新它。 
  • 排他锁:排它锁用于修改数据的场合。它锁定的资源,其他事务不能读取也不能修改。 
  • 更新锁:更新锁在更新操作的初始化阶段用来锁定可能要被修改的资源,从而避免使用共享锁造成的死锁现象。 
事务传播:
  • 1、required  如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
  • 2、mandatory 使用当前的事务,如果当前没有事务,就抛出异常。
  • 3、requiresnew  新建事务,如果当前存在事务,把当前事务挂起。
  • 4、supports  支持当前事务,如果当前没有事务,就以非事务方式执行。
  • 5、not_supported  以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • 6、Never  以非事务方式执行,如果当前存在事务,则抛出异常。
  • 7、Nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与required类似的操作。
 
编程式(当你只有很少的事务操作时,编程式事务管理通常比较合适。)
声明式(如果你的应用中存在大量事务操作,那么声明式事务管理通常是值得的。它将事务管理与业务逻辑分离,而且在Spring中配置也不难。)
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!