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 });
     }}