`
y806839048
  • 浏览: 1121683 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

事物的传播策略--控制回滚的粒度,事物的隔离控制事物的并发---类似lock

阅读更多

事务隔离级别

事物的隔离控制事物的并发---类似lock

隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:

  • TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
  • TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
  • TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
  • TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

事务传播行为

事物的传播策略--控制回滚的粒度

所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

  • 事物之间绑在一起,要么一起提交,一起回滚  ----PROPAGATION_REQUIRED,用于严格一致性的要求
  •  
  • 隔离事物,事物之间不影响---TransactionDefinition.PROPAGATION_REQUIRES_NEW,用于流水线之间,但又各自记录的场景
  •  
  • 绑在一起的事物之间不影响,不一起回滚----PROPAGATION_NESTED,用于流水线之间,但又各自记录的场景
  •  
  •  
  •  
  • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事务超时

所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。

默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。

事务只读属性

只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。
默认为读写事务。

spring事务回滚规则

指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。

默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。
可以明确的配置在抛出那些异常时回滚事务,包括checked异常。也可以明确定义那些异常抛出时不回滚事务。

还可以编程性的通过setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。

@Transactional注解

 

@Transactional属性

  属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

用法

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

 

 

[java] view plain copy
 
  1. @Transactional(readOnly = true)  
  2. public class DefaultFooService implements FooService {  
  3.    
  4.   public Foo getFoo(String fooName) {  
  5.     // do something  
  6.   }  
  7.    
  8.   // these settings have precedence for this method  
  9.   //方法上注解属性会覆盖类注解上的相同属性  
  10.   @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)  
  11.   public void updateFoo(Foo foo) {  
  12.     // do something  
  13.   }  
  14. }  
分享到:
评论

相关推荐

    oracle-lock

    - **行级锁**:针对单个数据行进行锁定,提供最细粒度的并发控制。 - **表级锁**:锁定整个表,适用于低并发环境,因为其粒度较大,可能导致更多的锁冲突。 - **块级锁(Oracle 12c及以上版本)**:介于行级和表...

    数据库系统并发控制及其实现

    本文将基于提供的内容,深入探讨并发控制的理论基础,分析并发访问引起数据不一致的原因,并研究在分布式数据库系统中实现并发控制的具体策略。 ### 并发控制理论 #### 1.1 事务(Transaction) 事务是数据库操作...

    InterBase服务器的LOCK策略

    **InterBase服务器的LOCK策略详解** InterBase是一款关系型数据库管理系统,以其高效、稳定和安全性著称。在数据库系统中,锁(LOCK)机制是保证数据一致性与并发性的重要手段。本文将深入探讨InterBase服务器的锁...

    实用数据库的并发控制剖析

    随着技术的发展,新的并发控制方法和技术也在不断涌现,例如MVCC(多版本并发控制)、快照隔离等,这些方法在某些场景下可以提供更好的性能和灵活性。未来,随着分布式数据库和云原生技术的发展,数据库并发控制领域...

    mysql事务与锁机制(存储引擎和锁、MyISAM锁机制、InnoDB锁机制、Next-Key锁、Dead-Lock).docx

    行级锁意味着锁粒度更小,能够并行处理更多的并发操作,从而提高系统的整体吞吐量。InnoDB还引入了多种类型的锁来解决不同场景下的需求,如共享锁、排他锁等。 **3、锁操作API** - `LOCK TABLES table_name [READ|...

    Transactions and Concurrency.pptx

    在数据库管理中,事务(Transactions)和并发控制(Concurrency)是两个至关重要的概念,它们确保了数据的一致性和完整性,特别是在多用户环境下的操作。事务是数据库操作的基本单元,它包含一系列的数据库读写操作...

    Java核心知识总结包括Java基础、并发、MySQL、Springboot、MyBatis、Redis、RabbitMQ

    - Lock接口与原子类:ReentrantLock、Semaphore、CountDownLatch等提供更细粒度的锁控制。 3. **MySQL数据库** - SQL语言:学习SQL语句进行数据查询、插入、更新和删除。 - 数据库设计:了解关系数据库的基本...

    高级数据库技术计算机科学系ppt课件.ppt

    它通过封锁、封锁协议、并发控制策略等手段来维护数据的完整性和一致性,同时避免并发操作带来的各种问题,如丢失修改、不可重复读和读脏数据。理解并掌握这些概念和技术对于构建和优化大规模的互联网数据库系统至关...

    数据库系统原理英文课件:ch16 Concurrency Control.ppt

    本章主要探讨的是并发控制的策略和技术,特别是基于锁的协议、基于时间戳的协议、基于验证的协议、多粒度锁定、多版本并发控制以及索引结构中的并发问题。 1. **基于锁的协议**:锁是一种用于控制对数据项并发访问...

    MySQL面试题

    表级锁是MySQL中锁的最大粒度,适用于那些不需要高度并发的应用场景。这种类型的锁通常用于非事务性的存储引擎,例如MyISAM、MEMORY和CSV等。 ##### 锁的特性 - **优点**: - 实现简单,资源开销较小。 - 加锁...

    第18章1

    请求这些锁时,使用lock-X和lock-S指令。当事务请求锁时,必须通过并发控制管理器进行,只有在请求被批准后事务才能继续执行。 接着,锁兼容性矩阵是确定一个事务是否可以被授予某个数据项上的锁的关键工具。多个...

    MySQL锁模型与事物

    表级锁则是在操作表的级别上进行锁定,包括读锁(Read Lock)和写锁(Write Lock),适用于读多写少的情况,因为它的开销小但锁定粒度大,可能导致更多的阻塞。 MySQL还支持一种称为意向锁(Intention Locks)的...

    11数据库原理与应用教程—SQLServer数据库__考试题目(11)-.docx

    **锁的概念**: 锁是一种并发控制机制,用于防止多个事务同时访问相同的数据库资源,从而避免数据冲突和不一致性问题。 **锁的类型**: - **共享锁 (Shared Lock)**: 允许多个事务读取同一数据项,但不允许任何事务...

    orcale死锁查杀PB版

    - 监控和调整锁粒度:根据应用需求调整锁的粒度,平衡并发与锁定冲突。 总之,"Oracle死锁查杀PB版"是DBA处理数据库死锁问题的得力助手。通过理解死锁的原理,结合此工具,可以有效地防止和解决死锁问题,确保...

    MySQL中如何处理并发写入问题?

    MySQL 中如何处理并发写入问题? 在 MySQL 中,处理并发写入问题是非常重要的,因为并发写入操作可能会导致数据不一致和丢失。为了解决这个问题,MySQL 提供了一些机制来处理并发写入问题,本文将介绍这些机制。 ...

    MVCC-(Oracle-Innodb-Postgres)PPT课件.pptx

    多版本并发控制(MVCC)是一种数据库并发控制机制,旨在解决高并发读写操作下数据库的一致性和可扩展性问题。下面是MVCC的详细知识点: MVCC简介 MVCC是多版本并发控制的缩写,英文全称为Multi-Version ...

    数据库实验六

    **用户自定义封锁** 是另一种并发控制策略,允许用户通过在SQL语句中指定特定的锁(如`holdlock`、`tablockx`、`uplock`等)来控制并发访问。在实验中,通过模拟丢失修改问题,展示了如何使用事务和自定义锁来防止...

    mysql数据库锁+优化.pdf

    MySQL数据库中的锁机制是事务处理和并发控制的关键部分,它确保了数据的一致性和完整性。在MySQL中,尤其是InnoDB存储引擎,锁主要用于处理多用户同时访问同一数据时可能出现的冲突。以下是对锁的一些详细解释: 1....

    MySQL 全局锁、表级锁、行级锁

    MySQL 是一个广泛使用的开源关系型数据库管理系统,其在并发处理和数据安全性方面有着出色的表现。在多用户环境中,为了保证数据的一致性和完整性,MySQL 提供了多种锁定机制,包括全局锁、表级锁和行级锁。这些锁...

Global site tag (gtag.js) - Google Analytics