您的位置:首页 > 编程语言 > Java开发

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

2016-05-06 17:39 417 查看
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 });

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: