spring事务的一些概念

来源:互联网 发布:淘宝二级页面有什么用 编辑:程序博客网 时间:2024/05/18 18:02

1@Transactional

1)、注解放在类名称上面,@Transactional对这个类中的所有public方法都起作用

2)、@Transactional方法方法名上,只对这个方法有作用,同样必须是public的方法

2、事物配置中有哪些属性可以配置

1)、事务的传播性:@Transactional(propagation=Propagation.REQUIRED)

      如果有事务,那么加入事务, 没有的话新建一个(默认情况下)

2)、事务的超时性:@Transactional(timeout=30)//默认是30

      注意这里说的是事务的超时性而不是Connection的超时性,这两个是有区别的

3)、事务的隔离级别:@Transactional(isolation =Isolation.READ_UNCOMMITTED)

      读取未提交数据(会出现脏读,不可重复读) 基本不使用

4)、回滚:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class,Exception.class})

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

5)、只读:@Transactional(readOnly=true)

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false

3、spring事务的隔离级别

ISOLATION_DEFAULT使用数据库默认的事务隔离级别

ISOLATION_READ_UNCOMMITTED允许读取尚未提交的修改,可能导致脏读、幻读和不可重复读

ISOLATION_READ_COMMITTED允许从已经提交的事务读取,可防止脏读、但幻读,不可重复读仍然有可能发生

ISOLATION_REPEATABLE_READ对相同字段的多次读取的结果是一致的,除非数据被当前事务自生修改。可防止脏读和不可重复读,但幻读仍有可能发生

ISOLATION_SERIALIZABLE 完全服从ACID隔离原则,确保不发生脏读、不可重复读、和幻读,但执行效率最低。

4、spring事务的传播性

PROPAGATION_REQUIRED如果存在一个事务,则支持当前事务。如果没有事务则开启 PROPAGATION_SUPPORTS如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行 PROPAGATION_MANDATORY如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。PROPAGATION_REQUIRES_NEW总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 PROPAGATION_NOT_SUPPORTED总是非事务地执行,并挂起任何存在的事务。PROPAGATION_NEVER总是非事务地执行,如果存在一个活动事务,则抛出异常 PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 
      则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行5、spring事务回滚

在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。

什么是检查型异常什么又是非检查型异常呢

1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常

2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。

如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

原创粉丝点击