Spring事务概述
一、事务概述
事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。
事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:
原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;
一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整
性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,
否则数据库的数据就处于不一致(不正确)的状态。
隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性;
持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失
二、Spring事务配置使用
1、 编程式事务管理
所谓编程式事务指的是通过编码方式实现事务,包括三种方式:使用PlatformTransactionManager、使用TransactionTemplate编程、基于Savepoint的嵌套事务。
使用TransactionTemplate进行编程式事务管理是推荐的方式。我们以TransactionTemplate为例
定义数据源
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:/comp/env/jdbc/oracle</value>
</property>
</bean>
定义事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
定义dao
<bean id="customerDAO" class="com.waterye.dao.impl.CustomerDAOImpl">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean>
实现
public class CustomerDaoImpl extends JdbcDaoSupport implements CustomerDAO {
private DataSource dataSource;
pirvate TransactionManager transactionManager;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setTransactionManager(DataSourceTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void delete(Integer id) throws Exception {
String deleteSql = "delete from customer where id = ?";
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
getJdbcTemplate().update(deleteSql, new Object[] { id });
}
}
}
}
2、声明式事务管理
声明式事务管理可以避免这种不同系统关注点之间的纠缠,使得事务管理代码不用再去“污染”具体业务逻辑的实现,包括两种方式:Annotation元数据驱动的声明式事务、XML元数据驱动的声明式事务
我们以Annotation声明为例
定义数据源
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:/comp/env/jdbc/oracle</value>
</property>
</bean>
定义事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
定义JdbcTemplate
<bean id="jdbcTemplatePlatform"class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"ref="dataSource" />
</bean>
支持注解事务处理
<tx:annotation-driven transaction-manager="transactionManager"/>
实现
@Repository
public class CustomerDaoImpl implements CustomerDAO {
@Qualifier("jdbcTemplatePlatform")
private JdbcTemplate jdbcTemplate;
public void delete(Integer id) throws Exception {
String deleteSql = "delete from customer where id = ?";
this.jdbcTemplate .update(deleteSql, new Object[] { id });
}
}