美文网首页
Spring事务

Spring事务

作者: feiyingmm | 来源:发表于2018-03-25 17:59 被阅读0次

Spring事务使用

spring事物配置,声明式事务管理和基于@Transactional注解的使用
spring事务管理(详解和实例)

@Transactional(propagation=Propagation.REQUIRED)
@Transactional(timeout=30) 
@Transactional(rollbackFor={RuntimeException.class, Exception.class}) 
@Transactional(readOnly=true) 

主流数据库默认隔离级别

MySQL四种事务隔离级别详解及对比

事务隔离级别

Spring事务的隔离级别:[ˌaɪsəˈleʃən] 
1. ISOLATION_DEFAULT:默认的,使用数据库事务默认的隔离级别.另外四个与JDBC的隔离级别相对应 
2. ISOLATION_READ_UNCOMMITTED:会产生脏读,不可重复读和幻像读。它充许别外一个事务可以看到这个事务未提交的数据
3. ISOLATION_READ_COMMITTED: 可以避免脏读出现,可能会出现不可重复读和幻像读。保证一个事务修改的数据提交后才能被另外一个事务读取。
4. ISOLATION_REPEATABLE_READ :可以防止脏读,不可重复读。可能出现幻读。
5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

为了避免上面出现几种情况在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。

  1. 未授权读取(Read Uncommitted): 也称 未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过 “排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。
  2. 授权读取(Read Committed): 也称提交 读。允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。
  3. 可重复读取(Repeatable Read): 禁止 不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁 止任何其他事务。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。
  4. 串行(Serializable): 也称可串行读。提 供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机 制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠 事务均是串行的。

数据库并发操作存在的异常情况:

  1. 更新丢失(Lost update): 两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执 行任何锁操作因此并发事务并没有被隔离开来。
  2. 脏读取(Dirty Reads): 一个事务开始读取 了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚。
  3. 不可重复读取(Non-repeatable Reads): 一 个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交。
  4. 两次更新问题(Second lost updates problem): 无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成 第一次写操作失效。
  5. 幻读(Phantom Reads): 也称为幻像(幻 影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有 另外一个事务插入数据造成的。
隔离级别     更新丢失 脏读取 重复读取 幻读 
未授权读取     N        Y      Y      Y 
授权读取       N        N      Y      Y 
可重复 读取     N       N      N      Y 
串行           N        N      N      N

事务的传播性

[ˌprɒpə'ɡeɪʃn]:传播, [ˈmændətəri] :强制的,[nestɪd]:嵌套的,[ˌdefɪˈnɪʃn]:定义
1. PROPAGATION_REQUIRED: 默认,如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 
      则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

相关文章

  • 关于事务的思考

    Spring对于事务的支持 Spring事务接口 Spring事务管理器 Spring并不直接管理事务,而是提供多...

  • Spring事务

    Spring 事务 分类 Spring可以支持编程式事务和声明式事务。 编程式事务 实现 Spring使用事务管理...

  • Spring中实现事务方式

    Spring 中实现事务的方式 Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,...

  • Spring事务的传播特性引发的一场血案

    Spring事务的传播特性是对于Spring事务管理的一项特殊配置;Spring事务基于Spring AOP特性,...

  • Spring 事务实现分析

    1. Spring 事务简介 Spring 本身并不实现事务,Spring事务 的本质 还是 底层数据库 对事务的...

  • spring04

    Spring JdbcTemplate学习 Spring 声明式事务 xml配置实现 Spring 声明式事务 注...

  • 程序员之Spring

    1. Spring事务 spring的事务实现原理Spring事务将connection放入到当前线程的threa...

  • 面前温习

    Spring事务传播特性的浅析——事务方法嵌套调用的迷茫 解惑 spring 嵌套事务

  • 分布式事务(2)Spring事务

    2.1 Spring事务原理 Spring支持编程式事务和声明式事务。编程式事务就是用个事务类Transactio...

  • spring事务的实现原理

    spring实现事务的原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring...

网友评论

      本文标题:Spring事务

      本文链接:https://www.haomeiwen.com/subject/srlccftx.html