事务相关基本概念

在学习spring框架中事务相关的源码,还有学习一些分布式事务相关知识之前,先温习下事务相关的基础知识,后续还会进行更新和补充。

事务特性

事务特性分为四个:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)简称ACID

原子性(Atomicity)

事务是数据库逻辑工作单元,事务中包含的操作要么全部执行成功,要么全部失败。

一致性(Consistency)

事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说明数据库处于一致性状态。如果在执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于不一致状态。

隔离性(Isolation)

一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及其使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。

持续性(Durability)

即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。

事务隔离级别

事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读提交)、read repeatable(读重复)、serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

读未提交(read uncommited)

最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。

读提交(read commited)

保证一个事务提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

读重复(read repeatable)

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

序列化(serializable)

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

脏读、不可重复读、幻读

脏读

指当一个事务正字访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作可能是不正确的。

不可重复读

指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。

幻读

一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条select语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)

隔离级别与数据读取问题的关系

√:可能出现;×:不可能出现 脏读 不可重复读 幻读
读未提交(read uncommited)
读提交(read commited) ×
读重复(read repeatable) × ×
序列化(serializable) × × ×

spring支持的7种事务传播特性

propagation_required

如果当前没有事务就创建一个,如果有就加入到这个事务中。Spring默认的事务传播特性。

propagation_supports

支持当前事务,如果没有当前事务,就以非事务方式执行。

propagation_mandatory

使用当前事务,如果没有当前事务则抛出异常。

propagation_required_new

新建事务,如果当前存在事务,把当前事务挂起。

propagation_not_supported

以非事务方式执行操作,如果当前存在事务,把当前事务挂起。

propagation_never

以非事务方式执行操作,如果当前存在事务则抛出异常。

propagation_nested

如果当前存在事务,则在嵌套事务内执行。如果当前无事务,则执行与propagation_required相同的操作。

投食入口