分享

Spring事务传播隔离只读回滚超时5种属性详细

 沙门空海 2018-02-05

本文主要讲述学习中了解的Spring事务的5种属性详情

事务5种属性
1.事务传播性 propagation
2.事务隔离性 isolation
3.事务回滚属性 rollbackfor…等
4.事务只读属性 readonly && 事务超时属性 timeout

用@Transaction声明注解方式代码图片实例
这里写图片描述

1).事务传播属性

  1. 当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务,
    并在自己的事务中运行.
  2. 事务的传播行为可以由传播属性指定. Spring 定义了 7 种类传播行为.

这里写图片描述

常用的有REQUIRED 和 REQUIRED_NEW 属性

按着需求来介绍

  • 新定义 Cashier 接口: 表示客户的结账操作
  • 修改数据表信息如下, 目的是用户 Tom 在结账时, 余额只能支付第一本书, 不够支付第二本书:

    这里写图片描述

Propagation 属性设置为REQUIRED 时事务情况

  1. 当 bookService 的 purchase() 方法被另一个事务方法 checkout() 调用时, 它默认会在现有的事务内运行.这个默认的传播行为就是REQUIRED. 因此在 checkout() 方法的开始和终止边界内只有一个事务. 这个事务只在
    checkout() 方法结束的时候被提交, 结果用户一本书都买不了
  2. 事务传播属性可以在 @Transactional 注解的 propagation 属性中定义
    如图所示 事务情况
    这里写图片描述

Propagation 属性设置为REQUIRED_NEW 时事务情况
另一种常见的传播行为是 REQUIRES_NEW. 它表示该方法必须启动一个新事务, 并在自己的事务内运行. 如果有事务在运行, 就应该先挂起它.
如图所示:
这里写图片描述
传播性还可以通过xml配置下,如图
这里写图片描述

那么并发事务也会导致的一些问题
**当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题
并发事务所导致的问题可以分为下面三种类型:

  1. 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚,T1读取的内容就是临时且无效的.
  2. 不可重复读:对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段,值就不同了.
  3. 幻读:对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1再次读取同一个表, 就会多出几行.
    因此我们需要将事务与事务之间隔离。

2).事务隔离性
- 从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题. 然而, 那样会对性能产生极大的影响, 因为事务必须按顺序运行.
- 在实际开发中, 为了提升性能, 事务会以较低的隔离级别运行.
- 事务的隔离级别可以通过隔离事务属性指定

1.事务隔离级别
Sping支持的事务隔离级别:上图
这里写图片描述

  1. 事务的隔离级别要得到底层数据库引擎的支持, 而不是应用程序或者框架的支持.
  2. Oracle 支持的 2 种事务隔离级别:READ_COMMITED , SERIALIZABLE
  3. Mysql 支持 4 中事务隔离级别.

3).设置回滚事务

  1. 默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚. 而受检查异常不会.
  2. 事务的回滚规则可以通过 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来定义.这两个属性被声明为 Class[] 类型的, 因此可以为这两个属性指定多个异常类.:上图
    这里写图片描述
  3. rollbackFor: 遇到IO、SQL Exception 时必须进行回滚
  4. noRollbackFor: 一组异常类,遇到ArithmeticException 时必须不回滚
  5. 一般这个值是不设置的,默认未检查异常(RuntimeException和Error类型的异常)会回滚。

4).超时和只读属性 readonly & timeout

为什么要有这两个属性

  • 由于事务可以在行和表上获得锁, 因此长时间的事务会占用资源, 并对整体性能产生影响. 所以引入超时属性。
  • 超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.
  • 如果一个事物只读取数据但不做修改, 数据库引擎可以对这个事务进行优化.所以引入只读属性。
  • 只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.

设置超时和只读事务属性
超时和只读属性可以在 @Transactional 注解中定义.超时属性以秒为单位来计算.上图:

这里写图片描述

在 Spring 2.x 事务通知中, 超时和只读属性可以在 元素中进行指定. 上图:
这里写图片描述

以上就是Sping事务属性的详细总结。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多