`
pouyang
  • 浏览: 321581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 事务管理-2

阅读更多
接 Spring 事务管理-1

1--在Spring中编写事务


public void method(){
		transactionTemplate.execute(
				new TransactionCallback() {
					public Object doInTransaction(TransactionStatus ts) {
						try {
							...........
						}catch (Exception e) {
							ts.setRollbackOnly();
						}
						return null;
					}
				}
				);
	}




2--Spring声明式事务

spring里声明式事务是用事务参数来定义的。一个事务参数就是对事务策略应该如何应用到某个方法的一段描述。虽然spring提供了几种声明事务的机制,但是它们都是依靠5个参数
来控制如何管理事务策略。

<!-- 配置事务属性 -->     
        <property name="transactionAttributes">     
            <props>     
                <prop key="*">PROPAGATION,ISOLATION(可选),readOnly(可选),-Exception,+Exception(可选)</prop>   
            </props>     
        </property>   


1,事务的控制只能做到方法的级别。
2,所有的事务策略都是依靠5个参数来控制。
下面看看这5个参数

第一个 PROPAGATION

 --1 mandatory
  --2 nested
  --3 never  多用于测试
  --4 not_supported  多用于只读
  --5 required  最常用
  --6 required_new
  --7 supports
 (就像启动多个 pl/sql 一样)    


  第二个 Isolation(隔离级别) 
        1 隔离级别定义一个事务可能受其他并发事务活动影响的程度
       2 也可以想象为那个事务对于事务处理数据的自私程度
       
        为什么要用隔离级别,因为并发导致了很多问题:
      问题一Dirty read(脏读)
:--脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据--如果这些在稍后被回滚了,那么第一个事务读取的数据就会是无效的
   这发生在两个事务当中,而oracle自身的事务默认隔离级别是read committed
   并发的话,这种情况在oracle默认的隔离级别应该不会发生
   (有个问题,oracle的隔离级别有几种,spring事务的隔离级别有5种,怎么对应起来呢?难道 oracle隔离级别+锁机制 == spring 事务隔离级别 (spring的隔离级别多于oracle的隔离级别)oracle的隔离级别read Committed,serializable与锁又有什么关系,有时间看下悲观锁和乐观锁 
    oracle的serializable
       1: 事务 1 serializable ,事务 2 readCommitted 事务2更新数据1未提交,事务1更新数据1处在等待状态
       如果事务2提交则事务1抱错无法连续访问事务边界
       如果事务2回滚则事务1更新操作可以执行
       2: 事务1 serializable, 事务2 插入一条数据未提交,事务1可以进行插入操作
          事务2提交,事务1不能读取到事务2插入的数据。

       说明serializable把那一行数据琐住了,如果行数据更改了,那么该事务就不能进行更改而readOnly事务可以进行更改
并发更新一条数据所采取的解决方案:
        1: 对事务采取serializable隔离机制
        2: 程序控制:多添加一个字段 例如加version字段每更新一次做+1的操作,每次更新的时候都进行比较也可以加日期字段,那就要取到ms了。)
 

  问题二Nonrepeatable read(不可重复读)              
 一个事务里面两次查询的结果都不同,由于另一并发事务在两次查询之间更新了数据(更新)


  问题三 Phantom reads (幻读)
当一个事务读取几行记录后,另一个并发事务插入了一些记录时,幻读就发生了,在后来的查询中,第一个事务就会发现一些原来没有的记录(插入)




为了解决这些问题引入的隔离机制


1--default  使用后端数据库默认的隔离级别   oracle好象有两种,read committed 和 serializable
             问阿南:oracle数据库的隔离级别

2--read_uncommitted  允许读取尚未提交的数据,可能导致脏读,幻读或不可重复读

3--read_committed   允许从已经提交的并发事务读取,可防止脏读,但幻读和不可重复读仍可能发生

4--repeatable_read 对相同字段多次读取是一样的,除非数据被当前事务本身改变,可防止脏读和不可重复读,但有可能发生欢读


5--serializable  完全服从ACID的隔离级别,确保不发生脏读,不可重复读和幻读,这在所以隔离级别中也是最慢的,因为它通常
                 是通过完全琐定当前事务所涉及的数据表来完成。



第三个 只读 

如果一个事务只对后端数据库执行读操作,那么该数据库就可能利用那个事务的只读特性,采取某些优化措施。
   通过把一个事务声明为只读,可以给后端数据库一个机会来应用那些它认为合适的优化措施。
   由于只读的优化措施是在一个事务启动由后端数据库实施的,因此,对于那些具有可能启动一个新事物的传播行为的
   方法来说,将事务声明为只读才有意义。
  
   此外,如果正在使用hibernate作为持久化机制,那么把一个事务声明为只读,将使Hibernate的flush模式被设置为
   FLUSH_NEVER,这就告诉Hibernate避免和数据库进行不必要的对象同步,从而把所有的更新延迟到事务的结束。


第四个 事务超时

   
可以设置在特定数秒后事务如果没有提交的话让他回滚


回滚规则

  
在默认设置下:事务只在出现运行异常(runtime exception)时回滚,而在出现受阻异常(checked exception)时不回滚
   在控制狂的设置下,就会变化的。






容器启动事务:

   1--insert一条数据
   2--commit;
   3--insert一条数据
   4--insert

容器提交事务
 
   1--不管发生了什么,1只有没错,1-insert永远插入
   2--如果三或者四发生了运行异常并且没有捕捉,则三四都回滚
   3--如果三或者四发生了运行异常且捕捉了,则若发生异常后面的全部回滚,发生异常前面的不回滚(注意:捕捉了!!)

  如果第三条语句出现问题,并且异常被捕捉到了
  则1--insert一条数据提交成功  ,commit 之后
  如果没有捕获到或者说没有做catch的操作,
  //只是在方法签名上做了throws动作,那么插入失败。
  则3--insert
 

这是我在ibatis情况下测试的,自己借助ibatis手动控制事务,

如果事务交给了spring容器管理,
会不会在 3-insert 处发生异常进行全部回滚。
1,经过测试不论发生什么情况:1都会执行,并插入到数据库中去。




sql异常 RuntimeException 捕获不到的,所以XX系统异常处理有问题

















      



      


分享到:
评论

相关推荐

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    - `spring-tx-5.2.6.RELEASE.jar`:事务管理服务,支持编程式和声明式事务处理。 - `spring-web-5.2.6.RELEASE.jar` 和 `spring-webmvc-5.2.6.RELEASE.jar`:Web相关的模块,分别对应基础Web支持和MVC框架。 每个...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改原有代码的情况下,为对象添加额外的功能,如事务管理、性能监控等。CGLIB的repack版本是对原始CGLIB库的重新打包,目的是为了...

    spring-tx-5.0.0.0.RELEASE.jar_java开发_spring-tx-5.0.0_

    《深入解析Spring TX 5.0.0:构建高效事务管理》 在Java开发领域,Spring框架以其强大的功能和灵活性而备受青睐。其中,Spring TX模块是Spring框架的重要组成部分,专注于提供事务管理服务。本文将深入探讨Spring ...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    10. **spring-tx-3.2.0.RELEASE.jar**:事务管理模块提供了编程和声明式的事务管理,支持JTA(Java Transaction API)和本地事务。这使得在Spring应用中管理事务变得容易。 这组Spring 3.2.0库的完整集合,为开发者...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    通过这种方式,Spring能够注入切面逻辑,比如日志记录、事务管理等,即使在不修改原有代码的情况下也能实现扩展功能。 其次,`spring-objenesis-repack-2.4.jar`是Objenesis库的一个版本,Objenesis是一个用于创建...

    spring-aop-jar

    2. 事务管理:确保一组数据库操作作为原子操作进行,如果出现异常则全部回滚。 3. 性能监控:统计方法的执行时间,用于性能分析。 4. 安全控制:在方法调用前检查权限。 总结起来,"spring-aop-jar"涉及了Spring...

    struts2-spring-plugin-2.2.1.jar

    3. **Spring事务管理**:插件允许Struts2的Action方法直接参与到Spring的事务管理中,无需关心事务的开启和提交。 4. **AOP集成**:结合Spring的AOP能力,可以为Struts2的Action提供切面增强,如性能监控、日志记录...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    在事务管理方面,Spring 2.5进一步完善了声明式事务管理,允许开发者通过注解或XML配置来定义事务边界,减少了手动处理事务的复杂性。此外,对JDBC、Hibernate、JPA等多种持久层技术的集成,使Spring成为了数据库...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    Spring事务处理-ThreadLocal的使用

    首先,了解Spring事务管理的基本概念。在多线程环境中,事务管理是至关重要的,它负责确保一组数据库操作要么全部成功,要么全部失败。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。声明式...

    spring-framework-1.0-with-dependencies.zip

    5. **spring-tx**:支持声明式事务管理,使得事务管理可以在不修改业务代码的情况下进行。 6. **spring-web**和**spring-webmvc**:这两个模块是Spring与Web应用的接口,前者提供HTTP Servlet的集成,后者则是...

    spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar

    5. **AOP(面向切面编程)**: AOP是Spring框架的重要特性之一,允许开发者将关注点分离,如日志记录、事务管理等,从业务逻辑中解耦。Objenesis和CGLIB在这里起到了代理生成的作用,使得切面能够在不修改目标类的...

    struts2-spring-plugin-2.0.11.1.jar

    而Spring框架则是一个全面的企业级应用开发框架,除了提供IoC和DI外,还包括事务管理、AOP(面向切面编程)、数据访问和Web服务等众多功能。 在Struts2中引入Spring插件,可以将Struts2的动作类(Action)声明为...

    官方原版spring-framework-4.3.18.RELEASE.zip

    通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-schema.zip"文件提供了Spring配置文件所使用的XML架构定义。这些架构文件定义了...

    struts2-spring-plugin-2.3.4.jar

    2. **事务管理(Transaction Management)**:Spring 提供了强大的事务管理功能,能够控制多个数据库操作是否作为一个事务进行。整合Struts 2 和Spring 后,我们可以在Spring 配置文件中定义事务规则,并让Spring ...

    spring-modules-0.9.zip

    在0.9版本中,Spring Modules可能已经包含了对Spring核心的扩展,比如AOP(面向切面编程)的增强,提供了一些预定义的切面,便于处理常见的企业级问题,如日志记录、事务管理等。同时,它可能还提供了对Spring IoC...

    spring-framework-4.3.5 所有JAR文件包

    - AOP允许开发者定义“方面”,这些方面封装了横切关注点,如日志记录、事务管理等。Spring AOP支持使用代理模式实现切面,包括基于类的代理和基于JDK动态代理。 4. **MVC框架**: - Spring MVC是Spring ...

    spring-data-redis 1.7.6

    4. **事务支持**:Spring Data Redis允许开发者使用`RedisTransactionManager`来管理Redis的事务,提供了与传统关系型数据库相似的事务操作能力,如BEGIN、COMMIT、ROLLBACK等。 5. **持久化策略**:Spring Data ...

    spring-data-commons-1.7.2.RELEASEspring-data-jpa-1.5.2.RELEASE-java datajpa

    1. **JPA 整合**:Spring Data JPA 提供了与 JPA 规范的无缝集成,包括实体管理、事务管理和数据源配置。 2. **EntityManager 和 Repository**:Spring Data JPA 封装了 `EntityManager` 和 `EntityTransaction`,...

    spring-framework-3.2.0.RELEASE-dependencies框架依赖包

    5. **事务管理**:Spring 提供了统一的事务管理接口,可以管理数据库事务以及基于JMS的消息事务。3.2.0版本提供了更灵活的编程和声明式事务管理策略。 6. **消息支持**:Spring 对Java消息服务(JMS)提供全面支持...

Global site tag (gtag.js) - Google Analytics