spring中的事务属性

简介:
    声明式事务是spring处理事务的标志性方式,它是在 TransactionDefinition 接口中定义各种各样的事务属性,然后通过TransactionProxyFactoryBean类或者TransactionInterceptor类或者<tx>和<aop>标签来在配置文件中进行事务属性在目标对象目标方法上的配置声明,以供 PlatfromTransactionManager使用,PlatfromTransactionManager  spring 事务管理的核心接口,不同的持久化技术各自都有它的实现类,如hibernate的就是HibernateTransactionManager。 声明式事务的好处是,使 我们从复杂的事务处理中得到解脱。使得我们再也无需去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需我们在与事务相关的方法中处理大量的  try    catch    finally  代码。
    事务属性通常由事务的隔离级别,传播属性,事务的超时值,事务的只读标志以及事务的回滚策略组成。
 
1.事务的隔离级别:
  ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用后台数据库默认的事务隔离级别.
  ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它允许你读取未提交的数据,这种隔离级别会产生脏读,不可重复读和幻像读。
  ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。可以防止脏读,但是还可能发生不可重复读和幻读。
  ISOLATION_REPEATABLE_READ: 这种事务隔离级别除了保证一个事务不能读取另一个事务未提交的数据外,还保证了一个事务对相同字段的多次读取结果都是一致的,除非数据被事务本身改变。 可以防止脏读,不可重复读。但是可能出现幻像读。
   ISOLATION_SERIALIZABLE:这是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。但是它的代价也是最高的。
 
2.事务的传播特性:
   PROPAGATION_REQUIRED: 表示当前方法必须运行在一个事务中。如果运行环境中已有一个事务在运行,该方法就运行在这个事务中,否则,就要开始一个新的事务。
   PROPAGATION_SUPPORTS:表示当前方法支持但不需要事务处理环境。如果运行环境中已有一个事务在运行,该方法就运行在这个事务中,否则,该方法就在非事务环境下运行。
   PROPAGATION_MANDATORY:表示该方法强制性的运行在事务环境中。如果运行环境中已有一个事务在运行,该方法就运行在这个事务中,否则,就抛出异常。
   PROPAGATION_REQUIRES_NEW:表示该方法总是运行在它自己的事务中。如果运行环境中已有一个事务在运行,则将原来事务挂起。
   PROPAGATION_NOT_SUPPORTED:表示该方法总是运行在非事务环境中。如果运行环境中已有一个事务在运行,则将原来的事务挂起。
   PROPAGATION_NEVER:表示该方法总是运行在非事务环境中。如果运行环境中已有一个事务在运行,则将抛出异常。
   PROPAGATION_NESTED:表示该方法可以运行在嵌套事务中。如果运行环境中已有一个事务在运行,则该方法运行在一个嵌套事务中。运行在嵌套事务中的方法可以从当前事务中单独的进行提交或回滚。否则,
它跟PROPAGATION_REQUIRED的性质是一样的。
 
3.事务的只读标志:
  readOnly:由于事务操作最终都是由后台数据库来具体实施的,配置了readOnly的方法在进行数据库操作时会采取一些优化措施,比如避免脏数据检查等。注意,如果使用hibernate,还要把该方法的flush模式设置成FLUSH_NEVER,如:template.setFlushMode(HibernateTemplate.FLUSH_NEVER);
   另外,我们不难发现,只有将那些可能产生新事务的方法的事务配置成readOnly才有意义(传播属性为PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED)。
   spring默认没有只读标志。
 
4.事务的超时策略
   假设你的事务在预料之外长时间运行,因为事务可能设计对后台数据库的锁定,长时间运行的事务会不必要的占用数据库自愿。与其等它结束,不如声明一个事务,在指定时间内不结束就自动回滚。
   由于超时策略是在事务启动时就开始计时,所以也只有将那些可能产生新事务的方法的事务配置成readOnly才有意义(传播属性为PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED)。
 
5.事务的回滚策略:
  spring默认的回滚策略是:发生异常不一定回滚,只有发生运行时异常才回滚。但是,我们可以在配置文件中对具体异常类型的回滚策略进行控制,并且前面带"+"表示提交,带"-"表示回滚。



     本文转自NightWolves 51CTO博客,原文链接: http://blog.51cto.com/yangfei520/267766 ,如需转载请自行联系原作者
相关文章
|
16天前
|
存储 Java 数据安全/隐私保护
|
18天前
|
Java 数据库 开发者
|
3天前
|
SQL Java 关系型数据库
Spring 事务
Spring 事务
6 1
|
5天前
|
XML Java 数据格式
Spring 属性注入方式
Spring 属性注入方式
13 2
|
5天前
|
Java 数据库连接 数据库
Spring事务简介,事务角色,事务属性
Spring事务简介,事务角色,事务属性
15 2
|
6天前
|
Java Apache Spring
Spring BeanUtils与Apache BeanUtils提供基本属性复制,适用于简单需求
Spring BeanUtils与Apache BeanUtils提供基本属性复制,适用于简单需求;Cglib BeanCopier用于转换为Cglib代理对象;Apache PropertyUtils处理属性操作;Dozer支持复杂对象映射。选择工具取决于具体需求,如需精细控制或对象映射,推荐Dozer或Apache PropertyUtils。Apache BeanUtils可能因潜在的封装性破坏被禁用。
20 3
|
9天前
|
Java 数据库连接 数据库
16:事务-Java Spring
16:事务-Java Spring
26 5
|
11天前
|
消息中间件 Java 关系型数据库
Spring事务与分布式事务
这篇文档介绍了事务的概念和数据库事务的ACID特性:原子性、一致性、隔离性和持久性。在并发环境下,事务可能出现更新丢失、脏读和不可重复读等问题,这些问题通过设置事务隔离级别(如读未提交、读已提交、可重复读和序列化)来解决。Spring事务传播行为有七种模式,影响嵌套事务的执行方式。`@Transactional`注解用于管理事务,其属性包括传播行为、隔离级别、超时和只读等。最后提到了分布式事务,分为跨库和跨服务两种情况,跨服务的分布式事务通常通过最终一致性策略,如消息队列实现。
|
12天前
|
监控 Java 测试技术
Spring Boot与事务钩子函数:概念与实战
【4月更文挑战第29天】在复杂的业务逻辑中,事务管理是确保数据一致性和完整性的关键。Spring Boot提供了强大的事务管理机制,其中事务钩子函数(Transaction Hooks)允许开发者在事务的不同阶段插入自定义逻辑。本篇博客将详细探讨事务钩子函数的概念及其在Spring Boot中的应用。
34 1
|
13天前
|
Java 开发者 Spring
Spring Boot中的资源文件属性配置
【4月更文挑战第28天】在Spring Boot应用程序中,配置文件是管理应用程序行为的重要组成部分。资源文件属性配置允许开发者在不重新编译代码的情况下,对应用程序进行灵活地配置和调整。本篇博客将介绍Spring Boot中资源文件属性配置的基本概念,并通过实际示例展示如何利用这一功能。
22 1