事务具有四大特性:原子性、一致性、隔离性、持久性;两大属性:隔离级别、传播行为。
1、事务四大特性
数据库如果支持事务的操作,那么就具备以下四个特性:
A、原子性:事务中的操作全部发生或全部不发生。
B、一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。从业务层理解是:A帐户转钱给B帐户100元钱,这时数据库事务就必须保证A帐户钱减100,B帐户加100,且最终a,b帐户余额也是正确的。
C、隔离性:一个事务的执行不能被其他事务干扰。事务有4种隔离级别:读未提交、读已提交、可重复读、串行化。
D、持久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
2、事务属性
A、传播行为:定义了何时要创建一个事务或者何时使用已有的事务。【propagation】
B、隔离级别:定义了一个事务可能受其他事务影响的程度。(脏读、不可重复读、幻读)【isolation】
C、只读
D、事务超时
E、回滚规则
3、事务4种隔离级别
隔离级别:定义了一个事务可能受其他事务影响的程度,为了有效保证并发读取数据的正确性。
A、读未提交:脏读、不可重复读、幻读
B、读已提交:避免脏读,仍然不可重复读、幻读
C、重复读:避免脏读、不可重复读,仍然幻读【默认】
D、串行化:避免脏读、不可重复读、幻读
脏读:因为事务回滚,导致前后读取数据不一致。
不可重复读:因数据被修改,导致两次读取数据不一致。
幻读:因新增或删除数据,导致前后读取数据不一致。
image.png
4、spring事务7种传播行为
事务传播行为:带有事务配置的方法,如何处理事务。定义了何时要创建一个事务或者何时使用已有的事务。
一、支持当前事务
propagation_required:
如果当前存在事务,则使用该事务;如果当前没有事务,则创建一个事务。
propagation_supports:
如果当前存在事务,则使用该事务;如果当前没有事务,则以非事务状态运行。
propagation——mandatory:
如果当前存在事务,则使用该事务;如果当前没有事务,则抛出异常。
二、不支持当前事务
propagation_requires_new:
创建一个新事务;如果当前存在事务则把当前事务挂起。
propagation_not_supported:
以非事务方式运行;如果当前存在事务则把当前事务挂起。
propagation_never:
以非事务方式运行;如果当前存在事务,则抛出异常。
三、其他情况
propagation_nested:
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。
如果当前没有事务,则创建一个事务。
@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
public class SpitterServiceImpl implements SpitterService{
@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
public void addSpitter(Spitter spitter){
}
}
网友评论