Spring事务的传播特性以及事务的隔离级别
一:事务的简介
事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性。
事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用。
二:事务的四个关键属性(ACID),和oracle相似
1:原子性:事务是一个原子操作,用一系列动作组成,事务的原子性确保动作要么全部完成要么完全不起作用。
2:一致性:一旦所有事务动作完成,事务就被提交,数据和资源就处于一种满足业务规则的一致性状态中。
3:隔离性:可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据破坏。
4:持久性:一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,通常情况下,事务的结果被写到持久化存储器中。
三:事务的传播特性,
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
事务方法之间存在父子关系。
例如:方法可能继续在现有的事务中运行,也可能开启一个新事务,并在自己的事务中运行。
下面是spring中的7中类传播行为:
1:REQUIRED:如果有事务,当前的方法就在这个事务中运行,否则就开启一个新的事务,并且在自己的事务内运行。
2:REQUIRES_NEW: 不管父方法是否存在事务 都会新建事务。
3:SUPPORTS:父方法存在spring事务 使用当前spring事务 没有spring事务 就使用jdbc事务(自动提交)。
4:NOT_SUPPORTED:不管父类中是否有spring事务,都不会使用spring事务,会使用jdbc事务(自动提交或回滚)。
5:MANDATORY :必须在spring事务环境下运行,父方法没有事务,抛出异常。
6:NEVER :父方法不能存在spring事务 如果有会抛出异常
7:NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。
四:事务通知中配置传播属性
可以像下面这样在<tx:method>元素中设定传播事务属性。
五:spring支持的事务的隔离级别
事务的隔离级别要得到底层数据库引擎的支持,而不是应用程序或者框架的支持。
Oracle支持的两种事务隔离级别:READ_COMMITED , SERIALIZABLE
Mysql支持四种事务隔离级别
六:设置隔离事务属性。
也可以在<tx:method>元素中指定隔离级别,通过isolation=””来设置。
七:超时和只读属性
由于事务可以在行和表上获得锁, 因此长事务会占用资源, 并对整体性能产生影响.
如果一个事务只读取数据但不做修改, 数据库引擎可以对这个事务进行优化.
超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.
只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务
八:设置超时和只读事务属性
Mysql默认10s,oracle永不超时。
九:设置回滚事务属性
回滚事务是在事务遇到运行时异常时发生,非运行时异常不会发生。
Rollback-for=”异常” 指定会自动回滚的非运行时异常
No-rollback-for=”” 指定某些运行时异常不回滚。