浅谈Spring-1-事务管理

目录

一、什么是事务

二、四种事务特性(ACID)

三、处理事务时可能会出现的三种安全性问题

四、事务的隔离级别(5种)

五、Spring事务管理

1、Spring 当中的@Transactional注解

2、Spring当中的事务传播行为

六、事务应该如何配置


一、什么是事务

事务是指逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.

 

二、四种事务特性(ACID)

原子性 (atomicity):强调事务的不可分割.

一致性 (consistency):事务的执行的前后数据的完整性保持一致.

隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰

持久性(durability) :事务一旦结束,数据就持久化到数据库

 

三、处理事务时可能会出现的三种安全性问题

脏读 :一个事务读到了另一个事务的未提交的数据

不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.

虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

 

四、事务的隔离级别(5种)

DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生。是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。

已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生。保证一个事务提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

可重复读 (repeatable read) :这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)

串行化的 (serializable) :这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读(避免三种问题)。

Mysql 默认事务隔离级别:可重复读

Oracle 默认事务隔离级别:读已提交

浅谈Spring-1-事务管理_第1张图片

 

五、Spring事务管理

以上是数据库和spring事务管理相通的部分,以下是spring的事务管理的特有的部分

1、Spring 当中的@Transactional注解

示例:

@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED,readOnly=true,rollbackFor=Exception.class)

1)回滚条件no-rollback-for与rollback-for:当AOP感知到何种异常时不执行回滚策略或者执行回滚策略。对于no-rollback-for,其覆盖范围为指定的Exception极其子类。而对于rollback-for则包括其子类以及RuntimeException及其子类.也就是说对于rollback-for,除了指定的Exception,RuntimeException是默认在覆盖范围的,用户无法通过rollback-for配置其它异常使得RuntimeException无法回滚

2)readOnly默认为false。设置为true时并不代表着此事务将只能读不能写,他对读写操作没有任何限制。这只是一个标识,告诉事务管理器这个事务是只读的,让事务管理器可以尝试使用只读的策略来优化这个事务。

2、Spring当中的事务传播行为

事务的传播行为:多个具有事务控制的service的相互调用时所形成的复杂的事务边界控制(7种)

PROPAGION_XXX :事务的传播行为

* 保证同一个事务中

PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)

PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务

PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常

* 保证没有在同一个事务中

PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务

PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务

PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常

PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行


六、事务应该如何配置

首先要明确没有通用的事务配置方式,要适合具体的业务场景。

1、如果只是对单个数据库操作,对性能要求不大,对于数据要求严格一致,那么把隔离级别设置为serializable,传播行为设置为PROPAGATION_MANDATORY

2、如果是微服务的分布式系统,经常操作多个数据源,大多数的数据库操作其实可以不用事务也不会有太大问题。对于少数对数据数据一致性有要求的可以单独配置事务。这样的系统的性能的要求是高一位的。

 

参考:https://blog.csdn.net/yue_hu/article/details/83340785

 

你可能感兴趣的:(java,spring,java,spring)