比如:会员信息表,修改日志表,保存会员信息表同时要把修改日志也要保存起来,如果会员信息保存出错,修改日志也无法保存,如何在同一个事务做到?,系统采用spring+hibernate
7 个解决方案
#1
用spring的声明试事务
#2
一个事物中有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>
<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
一个事物中有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>
<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