面试必问 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以上才支持. 其内部是有一个存盘点的概念, 每嵌套一个事务,就会有一个存盘点, 如果该存盘点出现异常, 那么回滚该存盘点的事务, 相当于开一个小的事务.

扫描二维码关注公众号,回复: 11756568 查看本文章

Spring的事物隔离级别

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108614499