一文了解Spring事务

Spring事务

事务基础知识

什么是事务?

  • 事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的特性(ACID)

  • 原子性(Atomicity)

    • 事务是最小的执行单位,不允许分割。事务的原子性动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency)

    • 事务必须使数据库从一个一致性状态变换为另一个一致性状态。

      一致性是指数据处于一种语义上的有意义且正确的状态。一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。

  • 隔离性(Isolation)

    • 多个用户并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库时独立的。
  • 持久性(Durability)

    • 一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

并发事务带来的问题

脏读

  • 一个事务读取另外一个事务还没有提交的数据

    事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因回滚(Rollback)了,那么事务T2读取的数据就是脏的(无效的)。

    • 解决方法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读)

丢失更新

  • 第一类丢失更新

    • A事务撤销时,把已经提交的B事务的更新数据覆盖了。

      • 解决办法:MySQL默认的事务隔离级别就可防止(REPEATABLE_READ)
  • 第二类丢失更新

    • A事务覆盖了B事务已经提交的数据,造成B事务所做的操作丢失

      • 解决办法:锁机制

不可重复读

  • 在同一个事务内,两次相同的查询返回了不同的结果

    事务T1会读取两次数据,在第一次读取某一条数据后,事务T2修改了该数据并提交了事务,T1此时再次读取该数据,两次读取便得到了不同的结果。

    • 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ(可重复读)

幻读

  • 当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。

    系统事务A将数据库中所有数据都删除的时候,但是事务B就在这个时候新插入了一条记录,当事务A删除结束后发现还有一条数据,就好像发生了幻觉一样。这就叫幻读。

    • 解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证。

事务的隔离级别

ISOLATION_DEFAULT

  • 使用数据库默认的隔离级别,MySQL默认采用的是REPEATABLE_READ

ISOLATION_READ_UNCOMMITTED

  • 最低的隔离级别,允许读未提交的数据变更,可能导致脏读、幻读和不可能重复读

ISOLATION_READ_COMMITTED

  • 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍有可能发生

ISOLATION_SERIALIZABLE

  • 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读、以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

事务传播机制

PROPAGATION_REQUIRED

  • 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中

PROPAGATION_SUPPORTS

  • 支持当前事务,如果当前没有事务,就以非事务方式执行

PROPAGATION_MANDATORY

  • 使用当前的事务,如果当前没有事务,就抛出异常

PROPAGATION_REQUIRES_NEW

  • 新建事务,如果当前存在事务,就把当前事务挂起

PROPAGATION_NOT_SUPPORTED

  • 以非事务方式执行,如果当前存在事务,就把当前事务挂起

PROPAGATION_NEVER

  • 以非事务方式执行,如果当前存在事务,则抛出异常

PROPAGATION_NESTED

  • 如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

XMind - Trial Version

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值