Spring的定义
对DI的初步理解
对AOP的初步理解
对DI的深入探究
对AOP的深入探究
Spring的事务管理
Spring MVC
首先来说一些概念性的东西,就是事务的的ACID属性:
原子性:事务中的操作要么都发生要么都不发生;
一致性:事物一旦结束了,数据不应当被破坏;
隔离性:一个用户的操作不能和其他用户的操作相混淆;
持久性:一旦事务完成,应当被持久化。
spring是不直接管理事务的,而是交给事务管理器。所有的spring事务管理器都是实现自PlatformTransactionManager接口的,比如,hibernate的事务管理器为HibernateTransactionManager类、JDBC或iBatis的事务管理器是DataSourceTransactionManager类等等。这里就不一一列举了,用到的话可以去查资料。下面给出了JDBC事务管理器的配置的例子:
<bean id=”transactionManager” class=”org.springframework.jdbc.datasource. DataSourceTransactionManager”> <property name=”dataSource” ref=”yourDataSourceBean” /> </bean>
下面我们就尝试用spring的TransactionTemplate方式编写一个事务,TransactionTemplate是通过一种叫做回叫机制的实现的。
public void youMethodName() //要加入事务管理的方法的名字
{
transactionTemplate.execute
(
new TransactionCallback()
{
public Object doInTransaction( TransactionStatus ts )
{
try
{
……… //这里写原来的业务逻辑代码
}
catch( Exception e )
{
ts.setRollbackOnly();
}
return null;
}
}
)
}
当然,在这个类的youMethodName方法中使用的transactionTemplate是需要被注入进来的。像如下这样:(其中飘红的依赖可以是上面说到的任何一种spring事务管理器。)
<bean id=”youClass” class=”com.alibaba.YouClass”> <property name=” transactionTemplate”> <bean class=”org.springframework.Transaction.support. TransactionTemplate”> < property name=” transactionManager” ref=” transactionManager” /> </bean> </ property> </bean>
下面来说一下spring的声明式事务。spring的声明式事务共有三种:一种是基于aop代理bean的方式;一种是基于简单的xml声明的tx命名空间的方式;最后一种是注释驱动事务。先来说一下spring定义事务的几个参数:传播行为、隔离级别、只读、事务超时、回滚规则。下面定义的是第一种声明式事务(基于aop代理bean的方式):
<bean id=”someService” class=” org.springframework.Transaction.interceptor.TransactionProxyFactoryBean”> <property name=”target” ref=”someServiceTarget” /> <property name=”proxyInterfaces” ref=”com.alibaba.service.SomeService” /> <property name=” transactionManager” ref=” transactionManager” /> <property name=” transactionAttributes”> <props> <prop key=”add*”>…</props> <prop key=”*”>…</props> </props> </property> </bean>
上面的transactionManager可以是前面提到的任何一种spring事务管理器。而transactionAttributes属性则是指明了事务的具体参数。它含有一个props集,该集含有N个prop属性,每个<prop>的键是一个方法名称的模式,而其具体指则是事务的具体参数。其中事务的具体参数的顺序为:传播行为(必选)、隔离级别(可选)、是否只读(可选)、回滚规则(可选),他们之间以逗号隔开。
下面的则是以tx命名空间声明的事务:
<tx:advice id=”txAdvice” transaction-manager=” transactionManager”> <tx:attributes> <tx:method name=”add*” ……> <tx:method name=”*” ……> </tx:attributes> </tx:advice>
其中“transaction-manager”指明了spring的事务管理器,<tx:attributes>则类似前面提到的<props>。省略号部分的属性名包括:isolation(事务隔离级别)、no-rollback-for(哪些异常事务是不需要回滚的)、propagation(事务的传播规则)、read-only(是否只读)、rollback-for(哪些异常应该回滚事务)、timeout(超时时间)。当然,这只是事务通知,我们还没有定义哪些bean应该被通知。
<aop:config> <aop:advistor pointcut=”” advice-ref=” txAdvice” /> </aop:advistor>
最后一种实现spring事务的方式是注释驱动的方式。在类或接口中都可以使用。只需要加上@Transactional(......)即可,括号里加上具体的事务参数。当然,配置文件中要加上如下代码:
<tx:annotation-driven transaction-manager=”txManager”>