@Transactional 注解的属性
xmlns:tx=http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"><!—切面类-->
<property name="sessionFactory" ref="sessionFactory"/><!--用数据库连接管理事物sessionFactory-->
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
关系梳理dataSource—》sessionFactory—》txManager—》事物的管理交给txManager
默认捕捉到的是runtime的异常,它会自动回滚,这时Session只能sessionFactory.getCurrentSession();,因为Hibernate中事物默认是thread的,所以可以看出事物自动加上,一但有异常不会增加记录,若没有spring管理代码应该这么写
try {
userDAO.save(u);
Log log=new Log();
log.setMsg("a user saved!");
logDAO.save(log);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
有了spring管理我们只需关心逻辑管理
userDAO.save(u);
Log log=new Log();
log.setMsg("a user saved!");
logDAO.save(log);
查阅资料:
propagation
public abstract Propagation propagation
The transaction propagationtype.
Defaults to Propagation.REQUIRED
.
Default:
org.springframework.transaction.annotation.Propagation.REQUIRED
propagation是一个枚举类型
事务传播设置是 PROPAGATION_REQUIRED,事务的产生过程
默认值REQUIRED
MANDATORY调用之前就必须存在一个事物,没有会报错
NESTED内嵌的,内部的执行完,外部在执行
NEVER必须没有事物
NOT_SUPPORTED有事物先挂起
REQUIES_NEW有事物先挂起,创建一个新的
SUPPORTS不用记
Xml:
因为用的是Hibernate:
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"ref="sessionFactory" />
</bean>、
在哪儿:
<aop:config>
<aop:pointcut id="bussinessService"expression="execution(public *com.*.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice"pointcut-ref="bussinessService"/>给了个建议,在service加建议,建议写在txAdvice
</aop:config>
加什么:
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*"read-only="true"/>
<tx:method name="add*"propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
好处不要不需要在每个方法上加trasational