Spring事务隔离级别、传播机制以及简单配置

一、spring支持的事务声明方式

1、编程式事物 当应用需要明确的,细粒的控制各个事物的边界,应该选择编程式事物。
2、声明式事物 当系统对于事物的控制粒度比较粗是,应该选择声明式事物,通过标签和切面形式在xml进行配置。
3、无论你选择上述何种事物方式去实现事物控制,spring都基于门面设计模式的事物管理器供选择。
4、关于什么是编程式事物和声明式事物————》




声明式事务:由于编程式事务每次实现都要单独实现,业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现。

所以这里就说一下声明式事物,声明式事务实现方式主要有2种,一种为通过使用Spring的tx:advice定义事务通知与AOP相关配置实现,另为一种通过@Transactional实现事务管理实现,通过下面的介绍7种传播途径
事务管理器 配置示例如下:


    
    

声明式事务
 !-- 
定义事务通知,用于指定事务属性,其中“transaction-manager”属性指定事务管理器,并通过指定具体需要拦截的方法
   拦截方法,其中参数有:
   
   name:方法名称,将匹配的方法注入事务管理,可用通配符

   propagation:事务传播行为,

   isolation:事务隔离级别定义;默认为“DEFAULT”

   timeout:事务超时时间设置,单位为秒,默认-1,表示事务超时将依赖于底层事务系统;

   read-only:事务只读设置,默认为false,表示不是只读;
  
   rollback-for:需要触发回滚的异常定义,可定义多个,以“,”分割,默认任何RuntimeException都将导致事务回滚,而任何Checked 
   
   Exception将不导致事务回滚;
  
   no-rollback-for:不被触发进行回滚的 
 
   Exception(s);可定义多个,以“,”分割;
-->

   
       
   	
   	
   	
   




   
   
   



  
   
   <!–声明自动代理–>
   

二、spring支持7种事务传播++行为++

传播行为 含义
propagation_required(xml文件中为required) 必须要有事物,如果有上下文关系,那么下文的方法可以运行在上文的事物中,如果上文事物结束了,那么下文重新开启事物
propagation_supports(xml文件中为supports 可以有事物,也可以没有事物,表示当前方法不必需要在事物中,如果有事物的话也可以在事物中运行。
propagation_mandatory(xml文件中为mandatory 表示当前方法必须在一个事物运行,如果没有事物将抛出异常
propagation_nested(xml文件中为nested)) 表示如果当前方法中正有一个事物运行中,则该方法应该运行在嵌套事物中,被嵌套的事物可以独立的在外部的事物中进行提交或者回滚。如果外部事物存在,并且抛出异常回滚,那么内层事物必须回滚,反之,内部事物回滚外部事物不受影响
propagation_never(xml文件中为never) 表示该方法不应该存在事物中运行,如果存在则会抛出异常
propagation_requires_new(xml文件中为requires_new)) 表示该方法必须运行在自己的事物中,如果没有事物就开启事物,如果上文有事物就等到上文结束或者提交、回滚后再开启新事物。
propagation_not_supported(xml文件中为not_supported 表示该方法不应该在一个事物中运行,必须没有事务,如果存在事务,则等事务结束(提交/回滚)之后再运行

三、spring中的事物隔离级别

隔离级别 含义
isolation_default 使用数据库默认的事物隔离级别
isolation_read_uncommitted 允许读取尚未提交的事物,可能导致脏读(update)、幻读(insert)、不可重复读
isolation_read_committed 允许从已提交的事物读取,可防止脏读、幻读、不可重复读,但还是任然有可能发生。
isolation_repeatable_read 对相同的字段多次读取的结果都是一样的,除非数据被当前的事物自生修改。可防止脏读、不可重复读,但幻读还是有可能发生(insert)
isolation_serializable 完全服从acid(原子性、一致性、隔离性、持久性)原则,确保不发生脏读、幻读、不可重复读,但执行效率最低

脏读、不可重复读、幻象读概念说明

脏读:指当一个事物正在访问数据,并且对其进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事物也访问了数据库中的这个数据,然后使用了这个数据,而这个数据是修改前的数据,也就是被修改的数据,是没用的,我们称之为脏数据。
不可重复读: 指一个事物内,多次读取同一数据,在这个事物还没有结束时,另外一个事物也访问该同一数据,那么在第一个事物两次读取的数据之间,由于第二个事物修改了第一个事物读取的数据,造成了第一个事物两次读取的数据不一样,这种情况被称之为不可重复读。
幻读:一个事物读取一个范围记录,但两次读取的数据不同,我们称之为幻读。(两次执行同一条select语句出现的结果不同,第二次读取会增加一条数据)

四、spring事务只读属性

   spring事务只读的含义是指,如果后端数据库发现当前事务为只读事务,那么就会进
   行一系列的优化措施。它是在后端数据库进行实施的,因此,只有对于那些有可能启
   动一个新事务的传播行为(REQUIRED,REQUIRES_NEW,NESTED)的方法来说,才有意义
   。(测试表明,当使用JDBC事务管理器并设置当前事务为只读时,并不能发生预期的
   效果,即能执行删除,更新,插入操作)!

五、spring的事务超时

   有的时候为了系统中关键部分的性能问题,它的事务执行时间应该尽可能的短。因此
   可以给这些事务设置超时时间,以秒为单位。我们知道事务的开始往往都会发生数据
   库的表锁或者被数据库优化为行锁,如果允许时间过长,那么这些数据会一直被锁定
   ,影响系统的并发性。

   因为超时时钟是在事务开始的时候启动,因此只有对于那些有可能启动新事物的传播
   行为(REQUIRED,REQUIRES_NEW,NESTED)的方法来说,事务超时才有意义。

六、事务回滚规则

   spring中可以指定当方法执行并抛出异常的时候,哪些异常回滚事务,哪些异常不回滚事务。默认情况下,只在方法抛出运行时异常的时候才回滚(runtime 
   exception)。而在出现受阻异常(checked exception)时不回滚事务。当然可以采用申明的方式指定哪些受阻异常像运行时异常那样指定事务回滚。

有什么写错的地方谢谢提出哈

你可能感兴趣的:(Spring)