注解方式实现声明式事务管理

使用注解实现Spring的声明式事务管理,更加简单!

步骤:

1) 必须引入Aop相关的jar文件

2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类

3)在需要添加事务控制的地方,写上: @Transactional

@Transactional注解:

1)应用事务的注解

2)定义到方法上: 当前方法应用spring的声明式事务

3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理;

4)定义到父类上: 当执行父类的方法时候应用事务。

修改bean.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    	 http://www.springframework.org/schema/beans/spring-beans.xsd
     	 http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
     	 http://www.springframework.org/schema/tx/spring-tx.xsd">

	<!-- 1、数据源对象:C3P0连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
		<property name="jdbcUrl" value="jdbc:sqlserver://localhost:1433;DataBaseName=Test"></property>
		<property name="user" value="sa"></property>
		<property name="password" value="123456"></property>
		<property name="initialPoolSize" value="3"></property>
		<property name="maxPoolSize" value="11"></property>
		<property name="maxStatements" value="50"></property>
		<property name="acquireIncrement" value="2"></property>
	</bean>

	<!-- 2、创建JdbcTemplate对象 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSource"></constructor-arg>
		<!-- 或者<property name="dataSource" ref="dataSource"></property> -->
	</bean>

	<!-- 3、开启注解扫描 -->
	<context:component-scan base-package="cn.gqx.b_anno"></context:component-scan>

	<!-- 4、注解方式实现事物 -->
	<!-- 事物管理器类 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<tx:annotation-driven transaction-manager="txManager"/>
</beans>

DeptService如下

@Service
public class DeptService {
	//接受容器注入的dao
	@Resource
	private DeptDao deptDao;

	//事物控制注解
	@Transactional(
			readOnly=false,	//读写事物
			timeout=-1,		//事物的超时时间不限制
			//noRollbackFor=ArithmeticException.class	//遇到数学异常不回滚
			rollbackFor=ArithmeticException.class,	//只回滚数学异常,指定更加精确
			isolation=Isolation.DEFAULT,		//事物的隔离级别,数据库的默认
			/*
			 * DEFAULT  使用后端数据库默认的隔离级别(spring中的的选择项)
			 * READ_UNCOMMITED 允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读
			 * READ_COMMITTED 允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生
			 * REPEATABLE_READ  对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。
			 * SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。
			 * 这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。
			 */
			propagation=Propagation.REQUIRES_NEW
			/*Propagation.REQUIRED
			 * 指当前方法必须在事物的环境下执行
			 * 如果当前运行的方法,已经存在事物,就会加入到当前事物
			 * Propagation.REQUIRES_NEW类似
			 * 指当前方法必须在事物的环境下执行;
			 * 如果当前运行的方法,已经存在事物,事物会挂起,始终开始一个新的事物
			 * 执行完后,刚才挂起的事物才继续运行
			 *
			 * 举例保存部门前要插入日志
			 * 不管是否将部门保存成功,都需要写入日志,这个时候要用REQUIRES_NEW
			 */

	)

	public void save(Dept dept){
		//第一次调用
		deptDao.save(dept);

		// 模拟异常,此时整个service.save()执行成功的时候要回滚
		int i=1/0;

		//第二次调用
		deptDao.save(dept);
	}
}


对propagation=Propagation.REQUIRES_NEW/Propagation.REQUIRED的测试

不管是否将部门保存成功,都需要写入日志,这个时候要用REQUIRES_NEW

Propagation.REQUIRED

指定当前的方法必须在事务的环境下执行;

如果当前运行的方法,已经存在事务, 就会加入当前的事务;

Propagation.REQUIRED_NEW

指定当前的方法必须在事务的环境下执行;

如果当前运行的方法,已经存在事务:  事务会挂起; 会始终开启一个新的事务,执行完后;  刚才挂起的事务才继续运行。

创建logDao

//测试,日志传播行为
@Repository
public class LogDao {
	@Resource
	private JdbcTemplate jdbcTemplate;
	@Transactional(propagation=Propagation.REQUIRES_NEW)
	public void save() {
		jdbcTemplate.update("insert into t_log values(‘保存数据了‘)");
	}
}

这个时候的DeptService如下

@Service
public class DeptService {
	//接受容器注入的dao
	@Resource
	private DeptDao deptDao;
	@Resource
	private LogDao logDao;

	//事物控制注解
	@Transactional(
			readOnly=false,	//读写事物
			timeout=-1,		//事物的超时时间不限制
			//noRollbackFor=ArithmeticException.class	//遇到数学异常不回滚
			rollbackFor=ArithmeticException.class,	//只回滚数学异常,指定更加精确
			isolation=Isolation.DEFAULT,		//事物的隔离级别,数据库的默认
			propagation=Propagation.REQUIRED
			)

	public void save(Dept dept){
		//保存日志
		logDao.save();

		// 模拟异常,此时整个service.save()执行成功的时候要回滚
		int i=1/0;

		//调用
		deptDao.save(dept);
	}
}

这个时候即出现数学异常日志的保存行为会正常的插入,而部门的保存会正常进行。

时间: 2024-10-26 07:34:53

注解方式实现声明式事务管理的相关文章

【Spring】—AOP之AspectJ注解方式实现声明式事务管理

前言 这回来说下注解方式的声明式事务管理. 正文 Demo 1.引入相关的jar包这里写图片描述 2.引入AOP约束<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/con

spring 声明式事务管理注解方式实现

使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制的地方,写上: @Transactional @Transactional注解: 1)应用事务的注解 2)定义到方法上: 当前方法应用spring的声明式事务 3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理; 4)定义到父类上: 当执行父类的方法时候应用事务. 案例: 1.

全面分析 Spring 的编程式事务管理及声明式事务管理--转

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

spring声明式事务管理

Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务. 声明式事务管理分为两种:1.配置文件   2.注解 1.配置文件(声明式事务管理)用法: 在applicationContext.xml配置文件中配置①事务管理器(事务管理者).②事务参数(事务通知).③AOP配置 如下: applicationContext.xml配置文件代码 1 <!-- 事务管理器(

分析 Spring 的编程式事务管理及声明式事务管理(转)

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

Spring 的编程式事务管理及声明式事务管理

本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

spring事物配置,声明式事务管理和基于@Transactional注解的使用

参考来源:http://blog.csdn.net/bao19901210/article/details/41724355 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用TransactionTemplate. 声明式事务管理建立在A

Spring学习之Spring的声明式事务管理详解

声明式事务管理 大多数Spring用户选择声明式事务管理的原因是,这个是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念. Spring声明式事务管理可以在任何环境下使用.只需更改配置文件, 它就可以和JDBC.JDO.Hibernate或其他的事务机制一起工作. Spring的声明式事务管理可以被应用到任何类(以及那个类的实例)上. Spring提供了声明式的回滚规则. Spring允许你通过AOP定制事务行为.(例如,如果需要,你可以在事务回滚中插入定制的行为. 你也可以增