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

spring事务管理

阅读更多
spring 提供了声明事务管理机制,在应用程序中可以让spring来统一管理事务,简化编程提高开发效率。
在这里以spring管理jpa事务为例
使用@PerstenceContext注解为应用注入实体管理器也就是EntityManager对象,简化的写一下代码,这样EntityManager对象就由容器来管理,在spring的配置文件中加入事务的配置,spring就可以管理应用的事务
  @PerstenceContext
  protected EntityManager em;

 
定义一个简单的service类(一般都把事务放在service层),使用注解配置事务
   @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
   void saveGoods(Goods goods);
   @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
   void removeGoods(Goods goods);
   //查找方法不需要配置事务
   Goods getGoodsById(int id);
   /**
    * 配置事务
    * 
    */
   @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
   void updateGoods(Goods goods);

 
注意在Service层一定要加上@Transactional注解,否则无法向数据库更新或删除记录。因为从spring容器注入的EntityManager是开启事务的,不加这个注解,不会向数据库提交。

下面简单说下@Transactional属性
直接在一个方法上写@Transactional,属性默认值
propagation= propagation.REQUIRED
rollbackFor=RuntimeException.class
readonly=false
事务的传播特性
1  PROPAGATION_REQUIRED 
   没有事务就开启一个事务,有事务就不在开启新事务,比如UserService有a和b方法,两个方法加上了@Transactional(propagation= propagation.REQUIRED
),在a方法中调用b方法,在执行a方法时如果没有事务,就开启一个事务,如果已经存在事务则在事务中运行,在执行b方法时,发现已经开启事务,则在事务中执行,这样任何一个发生异常,事务就会回滚,保证数据的正确性,spring默认使用这种事务级别。
2 PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形 式运行。

3 PROPAGATION_MANDATORY
  必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。 

4 PROPAGATION_REQUIRES_NEW
   不管当前是否存在事务,都新创建一个事务,比如UserService有a和b方法,b方法加上了@Transactional(propagation= propagation.PROPAGATION_REQUIRES_NEW
),在a方法中调用b方法,如果a方法已经开启一个事务,在执行b方法时,a事务会被挂起,b方法新启动一个事务,b方法执行完,a方法事务恢复继续执行,这样a方法发生了异常,数据回滚,但b方法不会回滚,因为a和b方法不在同一个事务中运行。   
5 PROPAGATION_NOT_SUPPORTED
  以非事务方式执行,如果当前存在事务,就把当前事务挂起,以非事务方式执行。
6 PROPAGATION_NEVER
  以非事务方式执行,如果当前存在事务,则抛出异常
  readonly设置事务是否为只读事务
  在jdbc中设置为true,说明这个事物是只读事物,不能执行更新删除操作,否则抛出异常,如果使用orm框架,则是一个优化提示,比如hibernate,则设置session的session的FlushModeType为FlushModeType.NEVER,这样hibernate就不会花费时间维护缓存与session缓存的数据同步,提高执行速度。个人认为,在查询方法中一般不用加事物,加上事物会增大开销。
rollbackFor
默认情况下,在程序抛出了运行时异常时,数据自动回滚,有时侯这样不满足要求,一般把这个属性值设置为Exception.class,出现异常事物就回滚。



  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics