SSH架构
业务原型:
在一级事务T1中查询出id为12345的持久化对象A1,并修改了A1的memo属性,T1提交之前调用了一个方法M,M中使用PROPAGATION_REQUIRES_NEW开启了一个新的事务T2,在T2中又查询出id为12345的持久化对象A2,修改了A2的memo属性,在T2提交后,A2的memo变化被同步到数据库中,但是在T1提交后A1所做的修改却没有同步到数据库中,而且也没有报数据版本异常。
通过调试发现:A1和A2虽然指向数据库中的同一行,但是是不同的对象实例
疑问:
1、Hibernate的持久化对象只应该在系统中存在一份,为什么这儿会出现A1、A2两个持久化对象呢?
2、为什么T1没有做任何提交动作(因为如果提交了的话肯定会报数据版本不同的异常)
源码分析:
在TransactionTemplate的<T> T execute(TransactionCallback<T> action)中会通过TransactionManager的getTransaction方法来取得TransactionStatus
1、取得当前线程所关联的SessionHolder
2、若存在SessionHolder并且开启了事务(this.sessionHolder != null && this.sessionHolder.getTransaction() != null),而且当前的的传播行为为PROPAGATION_REQUIRES_NEW
3、挂起当前线程绑定的事务及其事务同步器,取消当前线程和当前session和connection的绑定,并保存所有的挂起信息以供恢复
4、创建新的session,并开启新的事务
5、执行TransactionTemplate的TransactionCallback回调
6、在新事务提交后,会恢复上个事务的所有信息和执行
答1:可以看出,使用PROPAGATION_REQUIRES_NEW时,Spring会在一个请求线程中生成另一个独立的Hibernate的session和事务,所以会存在两份持久化对象
如果将事务传播方式改为PROPAGATION_NESTED,Spring会使用之前session和事务,并通过事务的SavePoint来实现嵌套事务。
另外,在Hibernate的reference里面有句话:A Hibernate Session is a transaction-level cache of persistent data. 可以理解为在一个session中只能有一个关联的事务(嵌套事务只是父事务的savepoint,不能算作一个事务),一旦这个事务结束将会移除这个关联关系(JDBCContext.afterTransactionCompletion方法中),并且一个session中开启的多个事务可以共享缓存
答2:怀疑在T1检查脏数据时认为没有脏数据,所以没有做任何提交
答2:跟踪发现确实报了乐观锁异常,日志打到另外的地方去了
分享到:
相关推荐
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER--以非事务方式执行,如果...
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务...PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED PROPAGATION_NEVER PROPAGATION_NESTED
loopy belief propagation 算法
Affinity_Propagation_(AP)_AP聚类聚类算法介绍
Cap01_Introduction to Wireless Propagation_信道建模_matlab_源码.rar.rar
Cap01_Introduction to Wireless Propagation_信道建模_matlab_源码.zip
propagation script for lasers
2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、Propagation.SUPPORTS 自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务 4、Propagation.NOT_SUPPORTED 自身不会开启事务,...
wave propagation_大气通信_大气湍流仿真_光通信仿真_大气湍流_大气湍流多步仿真程序_源码.zip
wave propagation_大气通信_大气湍流仿真_光通信仿真_大气湍流_大气湍流多步仿真程序.zip
simple back propagation
模拟真空中Gauss光束的三维场分布,方便加深高斯光束性质的理解
关于信道测量和天线方面的一本书,很经典。
Fundamentals of Antennas and Wave propagation Solutions for solving problems in standard textbooks.
激光光束在介质中传播的分析及仿真,可仿真光束传输特性,程序运行结果较为直观,
Back Propagation Neuual Networks
Error Back-Propagation Algorithm for MLP Neural Networks
simulation of Wireless Propagation
Script that solves and plot pulse propagation thru Split step Fourier method agrawal book
a model for wildfire propagation