`
ponlya
  • 浏览: 165487 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring3笔记之 事务传播

阅读更多

摘自:http://zhxing.iteye.com/blog/368110

 

 

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。如果是在事务中调用的,则加入事务中.

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。即不论是否存在事务,业务方法都会为自己发起一个事务.

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,并且实现者需要支持保存点事务机制。

 

 

事务隔离级别
      数据库并发操作存在的异常情况:
1. 更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来。
2. 脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚。
3. 不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交。要实现同一事务中可重复读,数据库实现快照可以实现,如mysql.
4. 两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效。
5. 幻读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的。
      为了避免上面出现几种情况在标准SQL规范中定义了4个事务隔离级别不同隔离级别对事务处理不同 。
1.未授权读取(Read Uncommitted):也称未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个事务则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。
2. 授权读取(Read Committed):也称提交读。允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。
3. 可重复读取(Repeatable Read):禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。mysql默认级别.
4. 串行(Serializable):也称可串行读。提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。

隔离级别     更新丢失 脏读取 重复读取 幻读
未授权读取     N            Y         Y          Y
授权读取        N            N         Y          Y
可重复读取     N            N         N         Y
串行               N            N         N         N
注解式测试:
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class UserDaoImpl implements UserDao {
	//private DataSource dataSource;
	private JdbcTemplate jdbcTemplate;
	
	public void setDataSource(DataSource dataSource) {
		//this.dataSource = dataSource;
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	@Transactional(rollbackFor=Exception.class)//碰到Exception类的异常则进行回滚
	//@Transactional(noRollbackFor=RuntimeException.class)//对运行时异常则是不回滚
	public void delete(int id) {
		jdbcTemplate.update("delete from  User where id = ?", 
				new Object[]{id},new int[]{java.sql.Types.INTEGER});
	}

	@Override
	//内嵌事务不会影响外面事务的提交与回滚
	//@Transactional(propagation=Propagation.NOT_SUPPORTED)/propagation设置事务传播行为,这里设置其不支持事务,如此则在方法执行前则不会开启事务
	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true,timeout=30)//设置只读事务,超时时间,默认30秒
	public List<User> getAllUser() {
		return (List<User>)jdbcTemplate.queryForObject("select * from User", new UserRowMapper());
		
	}

	@Override
	@Transactional(propagation=Propagation.NOT_SUPPORTED,
			readOnly=true,timeout=30)
	//设置只读事务,超时时间,默认30秒
	public User getUser(int id) {
		return (User)jdbcTemplate.queryForObject("select * from User",new Object[]{id},new int[]{java.sql.Types.INTEGER}
			,new UserRowMapper());
		
	}

	@Override
	public void save(User user) {
		jdbcTemplate.update("insert into User(name) values(?)", 
				new Object[]{user.getName()},new int[]{java.sql.Types.VARCHAR});
		
	}

	@Override
	public void update(User user) {
		jdbcTemplate.update("update  User set name = ? where id = ? ", 
				new Object[]{user.getName(),user.getId()},new int[]{java.sql.Types.VARCHAR,java.sql.Types.INTEGER});
		       		
	}

}
 XML式:
<bean id="dataSource" class="" destroy-method="">
		<property name="driverClassName" value="org.gjt.mm.mysql.Driver"> </property>
		<property name="url" value="jdbc:mysql://localhost:3301/SpringJDBC"></property>
		<property name="username" value="root"></property>
		<property name="password" value="126"></property>
		<property name="initialSize" value="1"></property>
		<property name="maxActive" value="100"></property>
		<property name="maxIdle" value="2"></property>
		<property name="minIdle" value="1"></property>
	</bean>
	
	<!-- 事务管理器 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<aop:config>
		<!-- 定义拦截点 -->
		<aop:pointcut id="transactionPointCut" expression="execution(* com.spring305.jdbc.test.po.UserDaoImpl2(..))" />
		<!-- 通知 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointCut"/>
	</aop:config>
	
	<!-- 设置事务行为 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
			<tx:method name="list*" read-only="true" />
			<tx:method name="query*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>
 

分享到:
评论

相关推荐

    spring学习笔记事务的

    这里使用了`DataSourceTransactionManager`作为事务管理器,它是Spring中最常用的事务管理器之一,适用于JDBC事务。 ##### 2. 启动事务注解 要在Spring应用中启用基于注解的事务管理,需要在配置类中添加@...

    Spring学习笔记(18)----使用Spring配置文件实现事务管理

    Spring定义了七种事务传播行为,如`REQUIRED`(默认,如果当前没有事务则新建,有则加入)、`SUPPORTS`(如果存在事务则支持,否则不开启)、`MANDATORY`(必须在现有事务中运行,否则抛异常)、`REQUIRES_NEW`...

    Spring.NET学习笔记17——事务传播行为(基础篇)代码下载

    Spring.NET事务配置模板。 原文出处:http://www.cnblogs.com/GoodHelper/archive/2009/11/16/SpringNet_Transaction.html

    学习笔记:尚硅谷Spring6基础篇

    - **Spring Context**:建立在核心容器基础之上,提供了对国际化支持、事件传播、资源加载以及应用层的集成接口等功能的支持。 - **Spring AOP**:提供面向切面编程的支持,允许以声明的方式将切面加入到业务方法中...

    spring学习笔记(十六)-声明式事务的例子

    在Spring框架中,声明式事务管理是其核心特性之一,它允许开发者通过配置来控制事务的行为,而无需在代码中显式地管理事务的开始、提交、回滚等操作。这种方式使得事务管理更加灵活,也使得代码更加简洁,易于维护。...

    Spring学习笔记.doc

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **1.1 什么是Spring** Spring框架是一个开源的轻量级应用框架,主要用于简化企业级应用程序的开发过程。它的核心特性在于提供了一种灵活的方式来组织和...

    Spring学习笔记(17)----使用Spring注解方式管理事务

    4. **事务传播行为** 传播行为定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务。比如`Propagation.REQUIRED`表示如果当前存在事务,那么加入当前事务,否则新建一个。 5. **事务隔离级别** 隔离...

    spring hibernate 事务管理学习笔记(一)

    同时,Spring的事务管理机制是其核心功能之一,支持编程式和声明式两种方式,使得开发者可以方便地控制事务的边界。 其次,Hibernate是Java领域最流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作...

    Spring.NET学习笔记16——事务管理Demo源码

    3. **事务传播行为**:Spring.NET支持七种事务传播行为,如`REQUIRED`(如果当前存在事务,则加入,否则新建)、`SUPPORTS`(如果存在事务则参与,不存在则不开启新事务)、`MANDATORY`(如果存在事务则参与,不存在...

    Spring学习笔记之九--声明式事务

    注解中还可以设置不同的属性,如propagation(事务传播行为)、isolation(隔离级别)、timeout(超时时间)和read-only(只读事务)等,以满足不同场景的需求。 例如,在一个简单的Spring MVC应用中,你可能会在...

    spring hibernate 事务管理学习笔记(二)

    此外,Spring的事务管理还支持PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW等不同的事务传播行为。例如,PROPAGATION_REQUIRED是默认的行为,表示如果当前存在事务,则加入该事务;如果没有事务,则新建一个。而...

    【狂神说】Spring全面详细笔记.md

    2. **Spring Context**:建立在Core之上,提供了一个配置文件的加载机制及事件传播机制。 3. **Spring AOP**:提供了面向切面编程的实现,让开发者能够更加方便地实现诸如事务管理等功能。 4. **Spring DAO**:提供...

    Spring学习笔记1

    在事务传播行为中,`required_new`表示如果当前方法在事务中,当前事务会被挂起,新开启一个事务执行被调用的方法,直到新事务结束,然后继续执行原方法的事务。而`required`则是最常见的情况,它表示如果方法需要在...

    Spring经典笔记

    Spring框架是Java企业级应用开发中的核心框架,它提供了全面的解决方案,包括数据访问、事务管理、AOP(面向切面编程)、MVC(模型-视图-控制器)等。本笔记主要关注Spring的基础知识,特别是针对初学者的入门实例。...

    Java相关课程系列笔记之十五Spring学习笔记

    【Spring学习笔记】 一、Spring概述 1.1 Spring框架的作用 Spring是一个开源的应用于企业级Java应用的全面框架,其主要目标是简化Java开发,提高代码可测试性,并促进良好的编程实践。它通过依赖注入(Dependency ...

    spring第一次课笔记

    本笔记将详细解析Spring框架的基础知识,帮助你更好地理解并掌握Spring的核心概念。 首先,我们需要了解Spring框架的主要模块: 1. **核心容器**:这是Spring框架的基础,包括BeanFactory和ApplicationContext。...

    spring 事务(6中配置完全降解)

    通过`TransactionProxyFactoryBean`,我们可以为特定的业务bean指定事务属性,如事务传播行为、隔离级别、超时等。 3. **BeanNameAutoProxyCreator** `BeanNameAutoProxyCreator`是Spring提供的一个通用代理工厂,...

    Spring&Mybatis&SpringMVC总结笔记-最全最基础.pdf

    本总结笔记是Spring、Mybatis、SpringMVC的综合学习资源,涵盖了这些框架的基本概念、配置方式、优点与适用场景,以及它们各自组件和功能点的详细解释。适用于初学者入门学习,同时也可以作为面试时的参考资料,帮助...

    SSH笔记-事务管理

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而这里的“SSH笔记-事务管理”主要关注的是Spring框架中的事务管理部分。Spring以其强大的依赖注入和面向切面编程能力,提供了灵活...

    Spring.NET-1.3.2.zip + Spring学习笔记

    **依赖注入** 是Spring.NET的核心特性之一,它反转了对象之间依赖关系的控制权。传统的编程中,对象通常会自行创建其依赖的对象实例,而在Spring.NET中,依赖关系由外部容器(IoC容器)负责管理和注入,使得对象只需...

Global site tag (gtag.js) - Google Analytics