面试必问 Spring的事物传播机制&隔离级别

Spring的事务抽象接口

Spring的事物传播机制

根据Sring的源码org.springframework.transaction.TransactionDefinition类中定义了传播机制

Spring的事务传播机制 :
两个Service业务, 其中ServiceA要调用ServiceB的某一个方法, 这个Service的方法都是在事务中执行的, 此时就涉及到事务的传播了.

PROPAGATION_REQUIRED : Spring的默认传播机制, 假如ServiceA已经在一个事务中了, ServiceB定义的传播机制是REQUIRED , 即必须要有一个事务,如果ServiceA没有开启事务的话, 那么Service会新建一个事务 . 如果ServiceA 已经有一个事务了, 那么ServiceB就不会再新建一个事务了.

PROPAGATION_SUPPORTS: 如果ServiceA要调用ServiceB, ServiceA本身就是在事务中的, 那么ServiceB也在事务中执行. 假如 ServiceA没有在事务中, 那么ServiceB也不在事务中执行 . 相当于有事务就有, 没有也没关系.

PROPAGATION_MANDATORY: 如果ServiceA要调用ServiceB , 那么ServiceA必须要在事务中, 如果没有就会报错.

PROPAGATION_REQUIRES_NEW: 如果ServiceA要调用ServiceB , 无论ServiceA是否在一个事务中, ServiceB一定会新建立一个事务. 相当于把ServiceA的事务挂起, 再开启一个事务 . 数据库的事务是不支持嵌套的, 此事务传播机制, 只是在JPA中起作用

PROPAGATION_NOT_SUPPORTED:即使ServiceA在事务中执行的, ServiceB也不在事务中执行 . 即相当于把ServiceA的事务挂起, ServiceB在无事务的状态下执行, ServiceB执行完成后, 再重启ServiceA的事务 .

PROPAGATION_NEVER : 绝不在一个事务中执行, 不允许在一个事务中存在.

PROPAGATION_NESTEDED: 嵌套事务 只有在JDBC中使用, 只有JDBC3.0以上才支持. 其内部是有一个存盘点的概念, 每嵌套一个事务,就会有一个存盘点, 如果该存盘点出现异常, 那么回滚该存盘点的事务, 相当于开一个小的事务.

Spring的事物隔离级别

根据Sring的源码org.springframework.transaction.TransactionDefinition类中定义了事物隔离级别

ISOLATION_DEFAULT 默认的隔离机制 ,数据库用的隔离级别是什么 ,那么我的事务用的隔离机制就是什么.

ISOLATION_READ_COMMITTED 两个事务在同时运行的时候, 一个事务可以读到另外一个事务已经提交的数据

ISOLATION_READ_UNCOMMITTED 两个事务在同时运行的时候, 一个事务可以读到另外一个事务还未提交的数据, 假如另外一个事务回滚了, 那么相当于是脏读

ISOLATION_REPEATABLE_READ 两个事务在同时运行的时候, 事务A运行的时间较长, 另外一个事务B已经提交了事务, 但是事务A是读不到事务B已经提交的事务. 一个事务内读多次, 读到的数据永远是一样的.

ISOLATION_SERIALIZABLE 线性读 , 即使是读操作, 多个事务是排队去执行的, 这样就不会有线程安全问题, 但性能最低

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值