Spring 事务配置管理
来源:互联网 发布:如何当网络作家 编辑:程序博客网 时间:2024/06/06 21:44
Spring声明式事物的配置:
数据源配置如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /></bean>
Springjdbc事物配置:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/></bean>
其他事物配置:
The JtaTransactionManager
does not need to know about the DataSource
, or any other specific resources, because it uses the container’s global transaction management infrastructure.
jta事物配置:JtaTransactionManager并不需要了解数据源,或任何其他特定的资源,因为它使用容器的全局事务管理基础设施。
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
txManager bean在这种情况下是HibernateTransactionManager类型的。以同样的方式作为DataSourceTransactionManager需要数据源的引用,HibernateTransactionManager需要SessionFactory的引用。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list> <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=${hibernate.dialect} </value> </property></bean><bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /></bean>
Example of declarative transaction implementation
考虑下面的实现。这个示例使用Foo和Bar类作为占位符,这样你就可以专注于事务使用没有聚焦于一个特定的域模型。对于本例,DefaultFooService类抛出UnsupportedOperationException实例方式在体内的每个实现的方法是好的,它可以让你看到事务,然后创建回滚在应对UnsupportedOperationException实例方式。
// the service interface that we want to make transactionalpackage x.y.service;public interface FooService { Foo getFoo(String fooName); Foo getFoo(String fooName, String barName); void insertFoo(Foo foo); void updateFoo(Foo foo);}
// an implementation of the above interfacepackage x.y.service;public class DefaultFooService implements FooService { public Foo getFoo(String fooName) { throw new UnsupportedOperationException(); } public Foo getFoo(String fooName, String barName) { throw new UnsupportedOperationException(); } public void insertFoo(Foo foo) { throw new UnsupportedOperationException(); } public void updateFoo(Foo foo) { throw new UnsupportedOperationException(); }}
Assume that the first two methods of the
FooService
interface, getFoo(String)
and getFoo(String, String)
, must execute in the context of a transaction with read-only semantics, and that the other methods, insertFoo(Foo)
and updateFoo(Foo)
, must execute in the context of a transaction with read-write semantics. The following configuration is explained in detail in the next few paragraphs.假设第一个FooService接口的两种方法,getFoo(字符串)和getFoo(字符串,字符串),必须用只读事务的上下文中执行语义,和其他方法,insertFoo(Foo)和updateFoo(Foo),必须在一个事务的上下文中执行读写语义。以下配置详细解释在接下来的几个段落。
<!-- from the file context.xml --><?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- this is the service object that we want to make transactional --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- the transactional advice (what happens; see the <aop:advisor/> bean below) --> <tx:advice id="txAdvice" transaction-manager="txManager"> <!-- the transactional semantics... --> <tx:attributes> <!-- all methods starting with get are read-only --> <tx:method name="get*" read-only="true"/> <!-- other methods use the default transaction settings (see below) --> <tx:method name=""/> </tx:attributes> </tx:advice> <!-- ensure that the above transactional advice runs for any execution of an operation defined by the FooService interface --> <aop:config> <aop:pointcut id="fooServiceOperation" expression="execution( x.y.service.FooService.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/> </aop:config> <!-- don't forget the DataSource --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <!-- similarly, don't forget the PlatformTransactionManager --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- other <bean/> definitions here --></beans>
事物的AOP 配置
<aop:config> <aop:pointcut id="fooServiceMethods" expression="execution(* x.y.service..(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/></aop:config>
测试
public final class Boot { public static void main(final String[] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml", Boot.class); FooService fooService = (FooService) ctx.getBean("fooService"); fooService.insertFoo (new Foo()); }}
test result
<!-- the Spring container is starting up... -->[AspectJInvocationContextExposingAdvisorAutoProxyCreator] - Creating implicit proxy for bean fooService with 0 common interceptors and 1 specific interceptors<!-- the DefaultFooService is actually proxied -->[JdkDynamicAopProxy] - Creating JDK dynamic proxy for [x.y.service.DefaultFooService]<!-- ... the insertFoo(..) method is now being invoked on the proxy -->[TransactionInterceptor] - Getting transaction for x.y.service.FooService.insertFoo<!-- the transactional advice kicks in here... -->[DataSourceTransactionManager] - Creating new transaction with name [x.y.service.FooService.insertFoo][DataSourceTransactionManager] - Acquired Connection [org.apache.commons.dbcp.PoolableConnection@a53de4] for JDBC transaction<!-- the insertFoo(..) method from DefaultFooService throws an exception... -->[RuleBasedTransactionAttribute] - Applying rules to determine whether transaction should rollback on java.lang.UnsupportedOperationException[TransactionInterceptor] - Invoking rollback for transaction on x.y.service.FooService.insertFoo due to throwable [java.lang.UnsupportedOperationException]<!-- and the transaction is rolled back (by default, RuntimeException instances cause rollback) -->[DataSourceTransactionManager] - Rolling back JDBC transaction on Connection [org.apache.commons.dbcp.PoolableConnection@a53de4][DataSourceTransactionManager] - Releasing JDBC Connection after transaction[DataSourceUtils] - Returning JDBC Connection to DataSourceException in thread "main" java.lang.UnsupportedOperationException at x.y.service.DefaultFooService.insertFoo(DefaultFooService.java:14)<!-- AOP infrastructure stack trace elements removed for clarity -->at $Proxy0.insertFoo(Unknown Source)at Boot.main(Boot.java:11)
Rolling back a declarative transaction
声明式事务的回滚下面的XML代码片段演示了如何配置回滚检查,特定于应用程序的异常类型:
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/> <tx:method name="*"/> </tx:attributes></tx:advice>
您还可以指定任何回滚规则,如果你不想要一个事务回滚时,就会抛出一个异常。下面的例子告诉Spring框架的事务基础设施提交服务员事务未处理的InstrumentNotFoundException面对。
<tx:advice id="txAdvice"> <tx:attributes> <tx:method name="updateStock" no-rollback-for="InstrumentNotFoundException"/> <tx:method name="*"/> </tx:attributes></tx:advice>
当Spring框架的事务基础设施捕获了一个异常和咨询配置回滚规则来确定是否标记为回滚事务,最匹配的规则赢。所以在以下配置的情况下,任何异常除了InstrumentNotFoundException结果在服务员的回滚事务:
<tx:advice id="txAdvice"> <tx:attributes> <tx:method name="*" rollback-for="Throwable" no-rollback-for="InstrumentNotFoundException"/> </tx:attributes></tx:advice>
你也可以表明需要回滚以编程方式。虽然很简单,这个过程相当入侵,Spring框架和代码紧密耦合的事务基础设施:
public void resolvePosition() { try { // some business logic... } catch (NoProductInStockException ex) { // trigger rollback programmatically TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }}强烈建议您使用声明性方法回滚(如果可能的话)。
Configuring different transactional semantics for different beans
考虑到场景中,你有一个服务层对象的数量,和你想应用一个完全不同的事务配置。这可以通过定义不同的<aop:advisor/>元素有不同的切入点和advice-ref属性值。例如:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* x.y.service..Service.(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- these two beans will be transactional... --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <bean id="barService" class="x.y.service.extras.SimpleBarService"/> <!-- ... and these two beans won't --> <bean id="anotherService" class="org.xyz.SomeService"/> <!-- (not in the right package) --> <bean id="barManager" class="x.y.service.SimpleBarManager"/> <!-- (doesn't end in Service) --> <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- other transaction infrastructure beans such as a PlatformTransactionManager omitted... --></beans>
下面的例子展示了如何配置两个不同的bean与完全不同的事务设置。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config> <aop:pointcut id="defaultServiceOperation" expression="execution(* x.y.service.Service.(..))"/> <aop:pointcut id="noTxServiceOperation" expression="execution(* x.y.service.ddl.DefaultDdlManager.(..))"/> <aop:advisor pointcut-ref="defaultServiceOperation" advice-ref="defaultTxAdvice"/> <aop:advisor pointcut-ref="noTxServiceOperation" advice-ref="noTxAdvice"/> </aop:config> <!-- this bean will be transactional (see the defaultServiceOperation pointcut) --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- this bean will also be transactional, but with totally different transactional settings --> <bean id="anotherFooService" class="x.y.service.ddl.DefaultDdlManager"/> <tx:advice id="defaultTxAdvice"> <tx:attributes> <tx:method name="get" read-only="true"/> <tx:method name=""/> </tx:attributes> </tx:advice> <tx:advice id="noTxAdvice"> <tx:attributes> <tx:method name="" propagation="NEVER"/> </tx:attributes> </tx:advice> <!-- other transaction infrastructure beans such as a PlatformTransactionManager omitted... --></beans>
y
<tx:advice/> settings
This section summarizes the various transactional settings that can be specified using the <tx:advice/>
tag. The default <tx:advice/>
settings are:
- Propagation setting is
REQUIRED.
- Isolation level is
DEFAULT.
- Transaction is read/write.
- Transaction timeout defaults to the default timeout of the underlying transaction system, or none if timeouts are not supported.
- Any
RuntimeException
triggers rollback, and any checkedException
does not.
You can change these default settings; the various attributes of the <tx:method/>
tags that are nested within <tx:advice/>
and <tx:attributes/>
tags are summarized below:
Table 11.1. <tx:method/> settings
name
Yes
Method name(s) with which the transaction attributes are to be associated. The wildcard (*) character can be used to associate the same transaction attribute settings with a number of methods; for example, get*
, handle*
, on*Event
, and so forth.
propagation
No
REQUIRED
Transaction propagation behavior.
isolation
No
DEFAULT
Transaction isolation level.
timeout
No
-1
Transaction timeout value (in seconds).
read-only
No
false
Is this transaction read-only?
rollback-for
No
Exception(s)
that trigger rollback; comma-delimited. For example, com.foo.MyBusinessException,ServletException.
no-rollback-for
No
Exception(s)
that do not trigger rollback; comma-delimited. For example,com.foo.MyBusinessException,ServletException.
- Spring 事务配置管理
- SPRING声明式事务配置管理
- Spring 声明式事务配置管理
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法
- Spring声明式事务配置管理方法(一)
- Spring声明式事务配置管理方法(二)
- android模拟器连接不到本地服务器
- c/c++ time->time_t->struct tm 中的tm_year 是从1900年算起的时间
- MySQL中group_concat函数
- java环境变量设置
- 让程序进入后台后能长久运行代码
- Spring 事务配置管理
- struts2 select标签的使用
- nginx做透明代理
- TC。求一个大数的最大因子满足完全平方数。
- Nodejs做RSA验证实例与豌豆荚RSA验证的实现,支付宝的RSA也一样可以使用,0.0
- Android 四种加载方式详解(standard singleTop singleTask singleInstance)
- 我对生活是不是有点太矫情了
- 【软件工程】生存期模型(含图)
- hdu 1151 Air Raid DaG 图的最小路径覆盖