Spring事务的传播特性以及事务的隔离级别

一:事务的简介

事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性

事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用

二:事务的四个关键属性(ACID),和oracle相似

1:原子性:事务是一个原子操作,用一系列动作组成,事务的原子性确保动作要么全部完成要么完全不起作用。

2:一致性:一旦所有事务动作完成,事务就被提交,数据和资源就处于一种满足业务规则的一致性状态中。

3:隔离性:可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据破坏。

4:持久性:一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,通常情况下,事务的结果被写到持久化存储器中。

三:事务的传播特性,

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

事务方法之间存在父子关系。

例如:方法可能继续在现有的事务中运行,也可能开启一个新事务,并在自己的事务中运行。

下面是spring中的7中类传播行为:

1REQUIRED:如果有事务,当前的方法就在这个事务中运行,否则就开启一个新的事务,并且在自己的事务内运行

2:REQUIRES_NEW: 不管父方法是否存在事务 都会新建事务

3:SUPPORTS:父方法存在spring事务 使用当前spring事务 没有spring事务 就使用jdbc事务(自动提交)

4:NOT_SUPPORTED:不管父类中是否有spring事务,都不会使用spring事务,会使用jdbc事务(自动提交或回滚)

5:MANDATORY :必须在spring事务环境下运行,父方法没有事务,抛出异常

6:NEVER :父方法不能存在spring事务 如果有会抛出异常

7NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。

:事务通知中配置传播属性

可以像下面这样在<tx:method>元素中设定传播事务属性。

 Spring事务的传播特性以及事务的隔离级别

五:spring支持的事务的隔离级别

 Spring事务的传播特性以及事务的隔离级别

事务的隔离级别要得到底层数据库引擎的支持,而不是应用程序或者框架的支持。

Oracle支持的两种事务隔离级别:READ_COMMITED , SERIALIZABLE

Mysql支持四种事务隔离级别

六:设置隔离事务属性。

也可以在<tx:method>元素中指定隔离级别,通过isolation=””来设置。

 Spring事务的传播特性以及事务的隔离级别

七:超时和只读属性

由于事务可以在行和表上获得锁,  因此长事务会占用资源, 并对整体性能产生影响.

如果一个事务只读取数据但不做修改, 数据库引擎可以对这个事务进行优化.

超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.

只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务

八:设置超时和只读事务属性

 Spring事务的传播特性以及事务的隔离级别

Mysql默认10soracle永不超时。

:设置回滚事务属性

回滚事务是在事务遇到运行时异常时发生,非运行时异常不会发生。

Rollback-for=”异常” 指定会自动回滚的非运行时异常

No-rollback-for=”” 指定某些运行时异常不回滚。

 Spring事务的传播特性以及事务的隔离级别


相关文章: