以前是每个业务逻辑方法开启一个事务,但是现在要加入一个操作日志记录。且此操作信息保存在数据库当中。
这就要保证一致性了。请问各位如何在前置通知里面开启一个事务,然后在后置通知里面提交事务。
我也想过用环绕通知。但不知道怎么写。
请各位帮助。
谢谢<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事务拦截器 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="Insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="Update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="Delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<!-- 方法切入点 -->
<bean id="methodPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>add*</value>
<value>delete*</value>
<value>amend*</value>
<value>Insert*</value>
<value>Update*</value>
<value>Delete*</value>
<value>save*</value>
</list>
</property>
</bean>
<!-- 操作记录通知,后置 -->
<bean id="userOprinfoBeforeInterceptor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="methodPointcut"/>
<property name="advice" ref="userOprinfoBeforeAdvice"/>
</bean>
<!-- 操作记录通知,前置 -->
<bean id="userOprinfoAfterInterceptor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="methodPointcut"/>
<property name="advice" ref="userOprinfoAfterAdvice"/>
</bean>
<!-- 自动拦截代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list><value>*Biz</value></list>
</property>
<property name="interceptorNames">
<list>
<value>userOprinfoBeforeInterceptor</value>
<value>transactionInterceptor</value>
<value>userOprinfoAfterInterceptor</value>
</list>
</property>
</bean>

解决方案 »

  1.   

    1。把transactionManager顺序放前面就行了还有一个能简单解决问题的一个方法是 你可以写一个类继承HibernateTransactionManager类,重写commit方法,然后配置到 <bean id="transactionManager"
    另外:我觉得记录操作日志的操作不应该和业务方法放在同一个事务中,因为无论业务方法是否执行成功,日志都应该要记录。具体你可以配置日志的事务传播属性为 NESTED
      

  2.   

    aop这东西俺以前看过,但一直没用过,等待高人解答
      

  3.   

    我上面说  应该是把 transactionInterceptor 放前面
    改成这样
    <property name="interceptorNames">
    <list>
    <value>transactionInterceptor</value>
    <value>userOprinfoBeforeInterceptor</value>
    <value>userOprinfoAfterInterceptor</value>
    </list>
      

  4.   

    问题解决了,使用spring的编程式事务。在beforeAdvice中开始事务。然后在afterAdvice中提交或回滚事务。
    谢谢大家
    spring编程式事务请参见 :
    http://blog.csdn.net/trwhoya/archive/2009/09/10/4539366.aspx