事务特性、隔离级别、spring事务的传播方式

事务就是逻辑上的一组对数据的操作。这些操作要么一起成功,要么一起失败。不允许出现个别成功个别失败的情况。

事务的特性(ACID特性)

  • 原子性(atomicity),强调事务的整体性和不可分割性,类似于化学中的原子,被认为是不可分割的单元。原子的执行是一个全部发生或者全部失败回滚的过程。
  • 一致性(consistency),事务的完成前后,数据的完整性保持一致。
  • 隔离性(isolation),事务与事务之间是互不干扰的,一个事务的执行不会影响到另一个事务。
  • 持久性(durability),事务结束后,其结果需要持久化。

事务的隔离级别

基于ANSI/ISO SQL的规范,事务共有四种隔离级别

  • 未提交读(read uncommited),什么是读未提交?顾名思义,就是在事务还没有提交的时候读取了值,可以造成脏读、不可重复读、幻读。举个例子,老板要给员工发工资,原来是2.2w,但是不小心按成了2.5w,这时候员工看到了自己的钱变成了2.5以为涨工资了,这时候老板发现了问题,回滚了事务,重新发了2.2w。而员工还是以为自己是2.5w,这便是脏读。如何解决脏读?读已提交就可以解决。
  • 读已提交(read commited),读已提交就是一个事务的读只能等到另一个事务提交之后才能读。但是会造成不可重复读、幻读的问题。例如,小明用自己的银行卡去购买东西,第一次刷卡的时候发现余额还有8000足够换个新手机,这个时候他的妻子使用他的卡付款购买了6000多的包,等到小明结账刷卡时发现余额不足(在他妻子的事务结束后读),这就是不可重复读(一个事务内读取统一数据获得不同的值)。怎么解决不可重复读呢?可重复读。
  • 可重复读(repeatable read),在事务开启之后,不允许其他人在对其进行修改操作,这便是可重复读。在事务开启之后小明的妻子就不可以修改(转出)金额,这时候交易就可以正常完成。什么时候出现幻读呢?幻读出现于insert的时候。例如:小明买手机花了3000元妻子去查看他的消费记录(事务开启)发现确实消费了3000元,这时候小明发现耳机坏了于是又花费1000元买了新耳机,他妻子打印消费记录时发现是4000元(事务提交),似乎出现了幻觉。这就是幻读。如何解决呢?序列化。
  • 序列化(serializable),以序列的方式对事务进行处理,只有事务提交之后才能查看数据的变化。但是它会对数据库的性能造成很大的影响。

各个隔离级别与脏读、不可重复读、幻读的关系如下

脏读不可重复读幻读
未提交读会造成会造成会造成
读已提交不会造成会造成会造成
不可重复读不会造成不会造成会造成
序列化不会造成不会造成不会造成

mysql默认的隔离级别为不可重复读

Spring事务的传播方式

PROPAGION_XXX:事务的传播行为。保证同一个事务中

  1. PROPAGATION_REQUIRED支持当前事务,如果不存在,就新建一个(默认)
  2. PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不适用事务
  3. PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
    *保证没有在同一个事务中
  4. PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
  5. PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
  6. PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  7. PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
    事务的传播方式详细可参照:
    事务属性之7种传播行为
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值