Spring事务管理2
通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的 PlatformTransactionManager的引用和事务属性。?事务属性含有上面描述的事务定义。
<bean id="petStore" ????src="//img.reader8.net/uploadfile/jiaocheng/20140188/3043/201401301443509755.gif">(一般来说是个好想法)。也可以通过从?org.springframework.aop.framework.ProxyConfig继承或所有AOP代理工厂共享 的属性来定制TransactionProxyFactoryBean的行为。这里的transactionAttributes属性定义在?org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource?中的属性格式来设置。这个包括通配符的方法名称映射是很直观的。注意 insert*的映射的值包括回滚规则。添加的-MyCheckedException?指定如果方法抛出MyCheckedException或它的子类,事务将 会自动回滚。可以用逗号分隔定义多个回滚规则。-前缀强制回滚,+前缀指定提交(这允许即使抛出unchecked异常时也可以提交事务,当然你自己要明白自己 在做什么)。
TransactionProxyFactoryBean允许你通过 “preInterceptors”和“postInterceptors”属性设置“前”或“后”通知来提供额外的 拦截行为。可以设置任意数量的“前”和“后”通知,它们的类型可以是?Advisor(可以包含一个切入点),?MethodInterceptor或被当前Spring配置支持的通知类型 (例如ThrowAdvice,?AfterReturningtAdvice或BeforeAdvice, 这些都是默认支持的)。这些通知必须支持实例共享模式。如果你需要高级AOP特 性来使用事务,如有状态的maxin,那最好使用通用的?org.springframework.aop.framework.ProxyFactoryBean, 而不是TransactionProxyFactoryBean实用代理创建者。
也可以设置自动代理:配置AOP框架,不需要单独的代理定义类就可以生成类的 代理。
附两个spring的事务配置例子:
<prop key="add">
???? PROPAGATION_REQUIRES_NEW, -MyException?
</prop>
注:上面的意思是add方法将独占一个事务,当事务处理过程中产生MyException异常或者该异常的子类将回滚该事务。
<prop key="loadAll">
????PROPAGATION_SUPPORTS, ISOLATION_READ_COMMITED, Readonly
</prop>
注:表示loadAll方法支持事务,而且不会读取没有提交事务的数据。它的数据为只读(这样有助于提高读取的性能)
附A Spring中的所有事务策略
PROPAGATION_MANDATORY
PROPAGATION_NESTED?
PROPAGATION_NEVER?
PROPAGATION_NOT_SUPPORTED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED_NEW
PROPAGATION_SUPPORTS
附B Spring中所有的隔离策略:
ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITED
ISOLATION_COMMITED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLESpring事务类型祥解
大家可能在spring中经常看到这样的定义:
?
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop><prop key="store*">PROPAGATION_REQUIRED</prop>
估计有好多朋友还没有弄清楚里面的值的意思,仔细看完下面应该知道自己什么情况下面应该使用什么样的声明。^_^
?
Spring中常用事务类型:
??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
spring声明式事务管理的两种方式传统的:
?1?<bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
?2?????????<property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/>
?3?????????<property?name="url"?value="jdbc:oracle:thin:@127.0.0.1:1521:dev"?/>
?4?????????<property?name="username"?value="kaktos"?/>
?5?????????<property?name="password"?value="kaktos"?/>
?6?????</bean>
?7?
?8?????<bean?id="txManager"
?9?????????class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
10?????????<property?name="dataSource"?ref="dataSource"?/>
11?????</bean>
12?
13?????<bean?id="businessBean"
14?????????class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
15?????????<property?name="transactionManager"?ref="txManager"?/>
16?????????<property?name="target"?ref="businessBeanTarget"?/>
17?????????<property?name="transactionAttributes">
18?????????????<props>????????????????
19?????????????????<prop?key="*">PROPAGATION_REQUIRED</prop>
20?????????????</props>
21?????????</property>
22?????</bean>
23?????
24?????<bean?id="businessBeanTarget"?class="sample.spring.trans.BusinessBean">
25?????????<property?name="dataSource"?ref="dataSource"?/>
26?????</bean>
这样做的弊端就是不得不为每个需要事务的bean做一次声明,如果所有的bean都基本上有一致的配置,这样就太繁琐啦。
下面是第二种方式:
?1?<beans>
?2?????<bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
?3?????????<property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/>
?4?????????<property?name="url"?value="jdbc:oracle:thin:@127.0.0.1:1521:dev"?/>
?5?????????<property?name="username"?value="kaktos"?/>
?6?????????<property?name="password"?value="kaktos"?/>
?7?????</bean>
?8?
?9?????<bean?id="txManager"
10?????????class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
11?????????<property?name="dataSource"?ref="dataSource"?/>
12?????</bean>
13?
14?????<bean?id="matchAllWithPropReq"
15?????????class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
16?????????<property?name="transactionAttribute"?value="PROPAGATION_REQUIRED"?/>
17?????</bean>
18?????
19?????<bean?id="matchAllTxInterceptor"?class="org.springframework.transaction.interceptor.TransactionInterceptor">
20?????????<property?name="transactionManager"?ref="txManager"?/>
21?????????<property?name="transactionAttributeSource"?ref="matchAllWithPropReq"?/>
22?????</bean>
23?
24?????<bean?id="autoProxyCreator"
25?????????class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
26?????????<property?name="interceptorNames">
27?????????????<list>
28?????????????????<idref?local="matchAllTxInterceptor"?/>
29?????????????</list>
30?????????</property>
31?????????<property?name="beanNames">
32?????????????<list>
33?????????????????<idref?local="businessBean"?/>
34?????????????</list>
35?????????</property>
36?????</bean>
37?????
38?????<!--??my?beans??-->
39?????<bean?id="businessBean"?class="sample.spring.trans.BusinessBean">
40?????????<property?name="dataSource"?ref="dataSource"?/>
41?????</bean>
42?</beans>
BeanNameAutoProxyCreator会在applicationcontext初始化后自动为beanNames属性中的bean建立proxy。