Spring-事务处理

原创 2016年05月30日 23:54:04
原始JDBC实现事务的代码如果是通过切面实现,大概是下面这样的。
public void transferMoney(){
	try{
		//@Before
		conn = dataSource.getConnection(); //每个事务Connection需要独立
		conn.setAutoCommit(false);
		
		//ProceedingJoinPoint.proceed()
		//实现事务中的业务逻辑操作
		
		//@AfterReturning
		conn.commit();//正常执行完事务后提交
	}catch(SQLException e){
		//@AfterThrowing
		e.printStackTrace();
		if(conn != null){
			try{
				conn.rollback(); //回滚未完成的数据库操作
			}catch(SQLException e){
				..
			}
		}
	}finally{
		//@After 后置通知
		if(conn!=null){
			try{
				conn.cloes();
			}catch(SQLException e){
				...
			}
		}
	}
}

使用Spring执行事务步骤:

1.配置事务管理器
<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.启用事务注解(需要加入tx命名空间)
<tx:annotation-driven transaction-manager="transactionManager"/>
3.添加@Transactional注解
只需要在需要使用事务的函数上面添加注解,即可。
@Transactional
public void transferMoney(){}

事务的传播属性

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
是继续在现有的事务中运行,还是开启一个新的事务等。
Spring定义了7种传播行为(用枚举实现):注意上面提到Transactional是修饰方法的,下面的情况都是对当前执行的方法的说明。
REQUIRED(默认) :如果有一个既有的事务,则调用新方法则继续使用已有的的事务。若没有则开启新事务。
REQUIRED_NEW:如果有新的事务,则新方法会将其挂起。并开启自己的事务。
后面几个不常用
SUPPORTS:如果有事务在运行,则当前方法在这个事务内运行,否则可以不在事务中运行。
NOT_SUPPORED:当前方法不支持,若有事务在运行,则将其挂起。
MANDATORY:当前方法必须运行在事物内部,如果没有正在运行的事务则异常。
NEVER:当前方法不运行在事务中,若有运行的事务则抛出异常。
NESTED:若有事务在运行,当前方法就应该在这个事务中嵌套事务内运行,否则就启动一个新的事务,并在他自己的事务内运行。
@Transactional(propagation=Propagation.REQUIRED)
public void transferAll(){
transferMoney(); //transferAll本身是有事务的,但是transferMoney也是有事务的,这种情况就适合上面描述的传播方式啦。
}

事务的其他特性

隔离级别: isolation=Isolation.READ_COMMITTED
指定回滚异常、不会滚异常(默认只有运行时异常回滚),也可以进行特殊的设置。
运行时异常不回滚设置例:@Transactional(noRollbackFor={RuntimeException.class})
指定事务是否可以更改数据:@Transactional(readOnly=true) 设置为true时,会被优化为无锁,相当于不使用事务。

指定timeout时间(单位是秒):@Transactional(timeout=1)指定回滚前到超时时间。

用xml配置事务

xml配置方式稍微有些麻烦,但是xml配置比较集中后期管理比较方便。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
	<context:property-placeholder location="c3p0.properties"/>
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
		<property name="driverClass" value="${driverClass}"></property>
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="initialPoolSize"  value="${initialPoolSize}"></property>
		<property name="maxPoolSize" value="${maxPoolSize}"></property>
	</bean>
	<!-- 配置JdbcTemplate -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 1.配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 2.配置事务属性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="transferMoney" propagation="REQUIRED" isolation="DEFAULT" read-only="false" timeout="-1" />
		</tx:attributes>
	</tx:advice>
	
	<!-- 3.配置事务切入点,关联切入点和事务 -->
	<aop:config>
		<aop:pointcut id="txPointcut" expression="execution(public void test.DbTransaction.transferMoney())"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
	</aop:config>
</beans>

<完>

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据库的事务处理

事务是这样一种机制,它确保多个SQL语句被当作单个工作单 元来处理。事务具有以下的作用: 一致性:同时进行的查询和更新彼此不会发生冲突,其他 用户不会看到发生了变化但尚未提交的数据。 可恢复...
  • liutao2016
  • liutao2016
  • 2017年01月10日 17:26
  • 429

关于mysql管理事务处理

前提:数据库引擎必须是InnoDB类型。 在mysql中,MyISAM和InnoDB是最常用的两种引擎,(其中MyISAM是默认引擎),其中 MyISAM 支持全文本搜索,但不支持事务;而 Inno...
  • baidu_30000217
  • baidu_30000217
  • 2015年12月21日 12:18
  • 1100

JDBC事务处理

一、JDBC事务 (1)事务是作为单个逻辑工作单元执行的一系列操作。 (2)事务维护了数据的完整性、正确语义、持久性。事务中的所有SQL语句必须被成功执行,则事务才会对数据库产生持久性的影响,...
  • u010870518
  • u010870518
  • 2014年09月20日 13:47
  • 2017

MySQL事务处理实现方法步骤

需求说明:  案例背景:银行的转账过程中,发生意外是在所难免。为了避免意外而造成不必要的损失,使用事务处理的方式进行处理: A账户现有余额1000元,向余额为200的B账户进行转账500元。可能由于某...
  • hello_zhou
  • hello_zhou
  • 2016年07月09日 12:39
  • 7499

ORA-01591 锁被未决分布式事务处理

数据库10.10.17.2 数据库10.10.17.3 10.10.17.2 SQL> create database link DBL_JUNE connect to test ident...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2014年11月23日 19:52
  • 1551

spring事务处理详解

1:Java包含两种异常:checked异常和unchecked异常。checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获try-catch-finally,而u...
  • u013628152
  • u013628152
  • 2015年08月25日 18:02
  • 4070

innodb和myisam 对事务的处理

innodb和myisam 对事务的处理: mysql> show create table test200\G; *************************** 1. row *****...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2015年11月03日 16:09
  • 541

详解EBS接口开发之库存事务处理-物料批次导入

库存事务处理-物料批次导入 --系统批次表 SELECT * FROM MTL_LOT_NUMBERS T; --API创建批次 inv_lot_api_pub.create_inv_lot(x_re...
  • caixingyun
  • caixingyun
  • 2013年12月04日 23:20
  • 3056

查找ORACLE出现“ORA-08177:无法连续访问此事务处理”问题的原因

ORA-08177: 无法连续访问此事务处理(Cannot serialize access),该问题是由ORACLE事务隔离级别引起的。 问题重现: 1、在事务1中执行:       updat...
  • caihongniaosi
  • caihongniaosi
  • 2014年03月10日 17:02
  • 970

EBS 在制资源待定事务处理(制造成本工作流程\资源成本工作流程)报错

解决:         成本管理器(缩写是CMCTCM)是一个触发“资源成本工作流程”(缩写是CMCCTW)或者“间接成本工作流程”(缩写是CMCOCW)来处理WIP_COST_TXN_INTERF...
  • x_focus
  • x_focus
  • 2014年09月24日 23:31
  • 1478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring-事务处理
举报原因:
原因补充:

(最多只允许输入30个字)