编程式事务控制:
见JDBC。
声明式事务控制:
一、什么是事务控制?
Spring的声明式事务控制,顾名思义就是采用声明的方式来处理事务。这里所说的声明是指在配置文件中声明,通过在applicationContext.xml中声明式地处理事务来代替代码式地处理事务。其底层实现基于Aop技术。
简单来说,Spring的声明式事务管理就是通过Aop对目标对象进行提交、回滚等操作的增强,实现对象的事务化。
二、有什么作用?
1、事务管理与开发的解耦。具体来说,业务对象不会意识到正处于事务管理之中。如果想要改变事务管理策略的话,只需要在定义文件中重新配置即可。
2、在不需要事务管理的时候,只要简单修改配置文件即可去除事务管理服务,无需更改代码,这样维护起来极其方便。
基于xml的声明式事务控制
要点:1、在xml中配置事务管理器;2、事务化增强、织入的配置。
数据库及Dao配置:
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${url}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
</bean>
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean name="account" class="基于xml的声明式事务控制.Dao.Impl.AccountImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!-- 控制对象,以其内部方法为切点-->
<bean name="service" class="基于xml的声明式事务控制.Dao.Impl.ServiceImpl">
<property name="accountDao" ref="account"/>
</bean>
事务管理器:
<!-- 配置平台事务管理器,明确事务对象 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
Aop配置:
<!-- 通知:事务对象的增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 设置事务属性 -->
<tx:attributes>
<!--name:切点名称,isolation:隔离级别,propagation:传播行为,read-only:只读-->
<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="save" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="findAll" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
<!--以update开头-->
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务对象的aop织入(若想取消对象的事务控制删除此配置即可) -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* 基于xml的声明式事务控制.Dao.Impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
基于注解的声明式事务控制
注解实现事务化配置可以更方便地事务化自定义对象,如dao类、service类的事务化,以及原本在xml中的事务化增强、Aop织入的配置都可以通过注解实现,极大提高了编程效率。
要点:1、在xml中配置事务管理器;2、事务化增强 @Transactional 注解配置;3、在xml中配置事务注解驱动:<tx:annotation-driven/>
@Transactional示例:
@org.springframework.stereotype.Service("service")
@Transactional(isolation = Isolation.READ_COMMITTED)//将此类下的所有方法事务化
public class ServiceImpl implements Service {
@Autowired
private Account account;
//将被注方法事务化,优先级大于类事务化注解
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public void transfer(String outMan, String inMan, double money) {
account.out(outMan,money);
//int error = 1/0;
account.in(inMan,money);
}
}