1: PROPAGATION_REQUIRED
加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
例如:
ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED
ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB就加入ServiceA.methodA的事务内部,就不再起新的事务。ServiceA.methodA没有在事务中,这时调用ServiceB.methodB,
ServiceB.methodB就会为自己分配一个事务。
在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚
2: PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
3: PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常
4: PROPAGATION_REQUIRES_NEW
例如:
ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,
当调用ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,他才继续执行。
PROPAGATION_REQUIRES_NEW与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度:
因为ServiceB.methodB和ServiceA.methodA两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,
如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
5: PROPAGATION_NOT_SUPPORTED
当前不支持事务。
例如:
ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,
调用ServiceB.methodB时,ServiceA.methodA的事务挂起,而以非事务的状态运行完,再继续ServiceA.methodA的事务。
6: PROPAGATION_NEVER
不能在事务中运行。
假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,
那么ServiceB.methodB就要抛出异常了。
7: PROPAGATION_NESTED
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而Nested事务的好处是他有一个savepoint。
Spring事务处理
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。
具体如下图:
第一种方式:每个Bean都有一个代理
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xmlns:context="http://www.springframework.org/schema/context"
5. xmlns:aop="http://www.springframework.org/schema/aop"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
8. http://www.springframework.org/schema/context
9. http://www.springframework.org/schema/context/spring-context-2.5.xsd
10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11.
12. <bean id="sessionFactory"
13. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14. <property name="configLocation" value="classpath:hibernate.cfg.xml" />
15. <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
16. </bean>
17.
18. <!-- 定义事务管理器(声明式的事务) -->
19. <bean id="transactionManager"
20. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21. <property name="sessionFactory" ref="sessionFactory" />
22. </bean>
23.
24. <!-- 配置DAO -->
25. <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
26. <property name="sessionFactory" ref="sessionFactory" />
27. </bean>
28.
29. <bean id="userDao"
30. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
31. <!-- 配置事务管理器 -->
32. <property name="transactionManager" ref="transactionManager" />
33. <property name="target" ref="userDaoTarget" />
34. <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
35. <!-- 配置事务属性 -->
36. <property name="transactionAttributes">
37. <props>
38. <prop key="*">PROPAGATION_REQUIRED</prop>
39. </props>
40. </property>
41. </bean>
42. </beans>
第二种方式:所有Bean共享一个代理基类
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:aop="http://www.springframework.org/schema/aop"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans
7 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
8 http://www.springframework.org/schema/context
9 http://www.springframework.org/schema/context/spring-context-2.5.xsd
10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11
12 <bean id="sessionFactory"
13 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
15 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
16 </bean>
17
18 <!-- 定义事务管理器(声明式的事务) -->
19 <bean id="transactionManager"
20 class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21 <property name="sessionFactory" ref="sessionFactory" />
22 </bean>
23
24 <bean id="transactionBase"
25 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
26 lazy-init="true" abstract="true">
27 <!-- 配置事务管理器 -->
28 <property name="transactionManager" ref="transactionManager" />
29 <!-- 配置事务属性 -->
30 <property name="transactionAttributes">
31 <props>
32 <prop key="*">PROPAGATION_REQUIRED</prop>
33 </props>
34 </property>
35 </bean>
36
37 <!-- 配置DAO -->
38 <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
39 <property name="sessionFactory" ref="sessionFactory" />
40 </bean>
41
42 <bean id="userDao" parent="transactionBase" >
43 <property name="target" ref="userDaoTarget" />
44 </bean>
45 </beans>
第三种方式:使用拦截器
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:aop="http://www.springframework.org/schema/aop"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans
7 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
8 http://www.springframework.org/schema/context
9 http://www.springframework.org/schema/context/spring-context-2.5.xsd
10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11
12 <bean id="sessionFactory"
13 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
15 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
16 </bean>
17
18 <!-- 定义事务管理器(声明式的事务) -->
19 <bean id="transactionManager"
20 class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21 <property name="sessionFactory" ref="sessionFactory" />
22 </bean>
23
24 <bean id="transactionInterceptor"
25 class="org.springframework.transaction.interceptor.TransactionInterceptor">
26 <property name="transactionManager" ref="transactionManager" />
27 <!-- 配置事务属性 -->
28 <property name="transactionAttributes">
29 <props>
30 <prop key="*">PROPAGATION_REQUIRED</prop>
31 </props>
32 </property>
33 </bean>
34
35 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
36 <property name="beanNames">
37 <list>
38 <value>*Dao</value>
39 </list>
40 </property>
41 <property name="interceptorNames">
42 <list>
43 <value>transactionInterceptor</value>
44 </list>
45 </property>
46 </bean>
47
48 <!-- 配置DAO -->
49 <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
50 <property name="sessionFactory" ref="sessionFactory" />
51 </bean>
52 </beans>
第四种方式:使用tx标签配置的拦截器
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:aop="http://www.springframework.org/schema/aop"
6 xmlns:tx="http://www.springframework.org/schema/tx"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans
8 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
9 http://www.springframework.org/schema/context
10 http://www.springframework.org/schema/context/spring-context-2.5.xsd
11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13
14 <context:annotation-config />
15 <context:component-scan base-package="com.bluesky" />
16
17 <bean id="sessionFactory"
18 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
19 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
20 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
21 </bean>
22
23 <!-- 定义事务管理器(声明式的事务) -->
24 <bean id="transactionManager"
25 class="org.springframework.orm.hibernate3.HibernateTransactionManager">
26 <property name="sessionFactory" ref="sessionFactory" />
27 </bean>
28
29 <tx:advice id="txAdvice" transaction-manager="transactionManager">
30 <tx:attributes>
31 <tx:method name="*" propagation="REQUIRED" />
32 </tx:attributes>
33 </tx:advice>
34
35 <aop:config>
36 <aop:pointcut id="interceptorPointCuts"
37 expression="execution(* com.bluesky.spring.dao.*.*(..))" />
38 <aop:advisor advice-ref="txAdvice"
39 pointcut-ref="interceptorPointCuts" />
40 </aop:config>
41 </beans>
第五种方式:全注解
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:aop="http://www.springframework.org/schema/aop"
6 xmlns:tx="http://www.springframework.org/schema/tx"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans
8 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
9 http://www.springframework.org/schema/context
10 http://www.springframework.org/schema/context/spring-context-2.5.xsd
11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13
14 <context:annotation-config />
15 <context:component-scan base-package="com.bluesky" />
16
17 <tx:annotation-driven transaction-manager="transactionManager"/>
18
19 <bean id="sessionFactory"
20 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
21 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
22 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
23 </bean>
24
25 <!-- 定义事务管理器(声明式的事务) -->
26 <bean id="transactionManager"
27 class="org.springframework.orm.hibernate3.HibernateTransactionManager">
28 <property name="sessionFactory" ref="sessionFactory" />
29 </bean>
30
31 </beans>
此时在DAO上需加上@Transactional注解,如下:
packagecom.bluesky.spring.dao;
importjava.util.List;
importorg.hibernate.SessionFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
importorg.springframework.stereotype.Component;
importcom.bluesky.spring.domain.User;
@Transactional
@Component("userDao")
publicclassUserDaoImplextendsHibernateDaoSupportimplementsUserDao {
publicList<User>listUsers() {
returnthis.getSession().createQuery("from User").list();
}
}
Spring事务处理原理
问题:
1、当JPA框架对数据库进行操作的时候,是从那里获取Connection?
2、jdbc对事务的配置,比如事务的开启,提交以及回滚是在哪里设置的?
3、Spring是通过aop拦截切面的所有需要进行事务管理的业务处理方法,那如何获取业务处理方法里面对数据库操作的事务呢?
解答:
1、既然在JPA的框架里面配置了datasource,那自然会从这个datasource里面去获得连接。
2、jdbc的事务配置是在Connection对消里面有对应的方法,比如setAutoCommit,commit,rollback这些方法就是对事务的操作。
3、Spring需要操作事务,那必须要对Connection来进行设置。Spring的AOP可以拦截业务处理方法,并且也知道业务处理方法里面的 DAO操作的JAP框架是从datasource里面获取Connection对象,那么Spring需要对当前拦截的业务处理方法进行事务控制,那 必然 需要得到他内部的Connection对象。整体的结构图如下:
优质内容筛选与推荐>>
1、将博客搬至CSDN2、列表list、字体font、文本test、背景background、边框border的属性3、hdu2159:FATE(二维费用背包)4、LeetCode 11. Container With Most Water5、1050. 螺旋矩阵(25)
长按二维码向我转账
受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。
阅读
好看
已推荐到看一看
你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
取消
分享想法到看一看
确定
最多200字,当前共字
微信扫一扫
关注该公众号