深入Spring事务(一)Spring事务概述

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值