同一个类中有两个manager类,操作两个不同表,如果保证是同一个事务[采用spring+hibernate]

时间:2021-12-07 19:25:26
现在同一个类,其中有两个manager,操作两个不同对象,但是我要保证两个对象在同一个事务中,该如何做到?
比如:会员信息表,修改日志表,保存会员信息表同时要把修改日志也要保存起来,如果会员信息保存出错,修改日志也无法保存,如何在同一个事务做到?,系统采用spring+hibernate

7 个解决方案

#1


用spring的声明试事务

#2


引用 1 楼 vivazhao 的回复:
用spring的声明试事务


一个事物中有N个操作

不说两个操作就是N个也可以控制

要么全部执行,要么全部回滚;

#3


事物的概念楼主好像还没理解,你说的 会员信息保存出错,修改日志也无法保存
这就是事物出错回滚

#4


使用spring的事务管理,把所有操作完全放到一个类里面,生成事务代理类

#5


但是我们的框架只是对所有的manager类进行事务,每一个manager类都是在一个事务中,不可能把所有的manager放置在同一个事务中吧,至少效率上更不敢恭维了。spring 配置文件:
<aop:config>
<aop:advisor id="userManagerTx" advice-ref="userManagerTxAdvice" pointcut="execution(* *..service.UserManager.*(..))" order="0" />
<aop:advisor id="userManagerSecurity" advice-ref="userSecurityAdvice" pointcut="execution(* *..service.UserManager.saveUser(..))"
order="1" />
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2" />
</aop:config>

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>

<tx:advice id="userManagerTxAdvice">
<tx:attributes>
<tx:method name="save*" rollback-for="UserExistsException" />
</tx:attributes>
</tx:advice>

#6


spring的aop是针对方法的,你的问题是事务的传播特性问题,你可以将某个方法的propagation="REQUIRED",这样如果当前有事务就用当前的,如果没有就自己开启一个,这样就保证了你的多个操作在同一事物中

#7


java技术群:69705156

#1


用spring的声明试事务

#2


引用 1 楼 vivazhao 的回复:
用spring的声明试事务


一个事物中有N个操作

不说两个操作就是N个也可以控制

要么全部执行,要么全部回滚;

#3


事物的概念楼主好像还没理解,你说的 会员信息保存出错,修改日志也无法保存
这就是事物出错回滚

#4


使用spring的事务管理,把所有操作完全放到一个类里面,生成事务代理类

#5


但是我们的框架只是对所有的manager类进行事务,每一个manager类都是在一个事务中,不可能把所有的manager放置在同一个事务中吧,至少效率上更不敢恭维了。spring 配置文件:
<aop:config>
<aop:advisor id="userManagerTx" advice-ref="userManagerTxAdvice" pointcut="execution(* *..service.UserManager.*(..))" order="0" />
<aop:advisor id="userManagerSecurity" advice-ref="userSecurityAdvice" pointcut="execution(* *..service.UserManager.saveUser(..))"
order="1" />
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2" />
</aop:config>

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>

<tx:advice id="userManagerTxAdvice">
<tx:attributes>
<tx:method name="save*" rollback-for="UserExistsException" />
</tx:attributes>
</tx:advice>

#6


spring的aop是针对方法的,你的问题是事务的传播特性问题,你可以将某个方法的propagation="REQUIRED",这样如果当前有事务就用当前的,如果没有就自己开启一个,这样就保证了你的多个操作在同一事物中

#7


java技术群:69705156