<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="mySessionFactory"/> </property> </bean>
首先就是配置事务的传播特性,如下:
<!-- 配置事务传播特性 --> <tx:advice id="TestAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="find*" propagation="REQUIRED"/> <tx:method name="get*" propagation="REQUIRED"/> <tx:method name="apply*" propagation="REQUIRED"/> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置参与事务的类 --> <aop:config> <aop:pointcut id="allTestServiceMethod" expression="execution(* com.test.testAda.test.model.service.*.*(..))"/> <aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" /> </aop:config>
需要注意的地方:
(1) advice(建议)的命名:由于每个模块都会有自己的Advice,所以在命名上需要作出规范,初步的构想就是模块名+Advice(只是一种命名规范)。
(2) tx:attribute标签所配置的是作为事务的方法的命名类型。
如<tx:method name="save*" propagation="REQUIRED"/>
其中*为通配符,即代表以save为开头的所有方法,即表示符合此命名规则的方法作为一个事务。
propagation="REQUIRED"代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
<tx:method name="*" read-only="true" /> 这一句是为其他方法添加只读事务
(3) aop:pointcut标签配置参与事务的类,由于是在Service中进行数据库业务操作,配的应该是包含那些作为事务的方法的Service类。
首先应该特别注意的是id的命名,同样由于每个模块都有自己事务切面,所以我觉得初步的命名规则因为 all+模块名+ServiceMethod。而且每个模块之间不同之处还在于以下一句:
expression="execution(* com.test.testAda.test.model.service.*.*(..))"
其中第一个*代表返回值,第二*代表service下子包,第三个*代表方法名,“(..)”代表方法参数。
(注释1:execution(* *(..)) 表示匹配所有方法
execution(public * com. savage.service.UserService.*(..)) 表示匹配com.savage.server.UserService中所有的公有方法
execution(* com.savage.server..*.*(..)) 表示匹配com.savage.server 包及其子包下的所有方法
execution(* *..service..*.*(..)) 表示匹配任意service包及其子包下的所有方法
(..) 表示匹配所有参数
注释2:如需配置多个execution,使用 || 或 && 操作符连接。如:
expression="(execution(* com.test.testAda.test.model.service.*.*(..)))||(execution(* com.test.testAda.ada.model.service.*.*(..)))"
)
(4) aop:advisor标签就是把上面我们所配置的事务管理两部分属性整合起来作为整个事务管理。(注释:Advisor是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。)
图解:
下面附上配置声明式事务的一些相关的资料,以下资料均来源于互联网:
附一、Spring事务类型详解
附二、对spring事务类型详解的一点补充(关于嵌套事务)
附三、Transaction后缀给声明式事务管理带来的好处
附四、Spring中的四种声明式事务的配置