事务的隔离级别
要想解决数据的的脏读幻读和不可重复读,首先要了解事务的隔离级别
事务的原则
一致性
隔离性
持久性
原子性
一致性
当执行失败,所有的修改都会恢复到修改之前的状态。
隔离性
在对修改的数据提交之前,对其他事务不可见。
持久性
通俗的讲就是保存到数据库永久存储(感觉是滴)。
原子性
任何执行过程中的失败,都将导致操作的失败。
数据库的读取问题
脏读:读取到尚未提交的数据。
不可重复读:前后多次读取,数据内容不一致。
幻读:前后多次读取数据总量不一致。
这里的幻读和不可重复度有点不好理解,具体的区别是:
对应不同的操作:
不可重复度:insert update
幻读:insert delete
解决方案
脏读:------修改时加排他锁 读取时加共享锁
不可重复度:------读取时加共享锁 写数据时加排他锁
幻读:------范围锁------锁定检索范围为只读
事务传播行为
- PROPAGATION_REQUIRED(必须有事务,这是默认值)
如果存在一个事务,则加入到当前事务。如果没有事务则开启一个新的事务。
- PROPAGATION_REQUIRES_NEW(必须有新的)
总是开启一个新的事务。如果存在一个事务,则将这个存在的事务挂起,再来一个新的。
- PROPAGATION_SUPPORTS(支持有事务)
如果存在一个事务,则加入到当前事务。如果没有事务则非事务运行。
- PROPAGATION_NOT_SUPPORTED(不支持有事务)
总是非事务地执行,并挂起任何存在的事务。
- PROPAGATION_MANDATORY(强制有事务,自己还不负责创建)
如果存在一个事务,则加入到当前事务。如果没有事务,则抛出异常。
- PROPAGATION_NEVER(强制不要事务,自己还不负责挂起):
总是非事务地执行,如果存在一个活动事务,则抛出异常。
- PROPAGATION_NESTED(嵌套事务)
如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务, 则开启一个新的事
务。
内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。
而内层事务操作失败并不会引起外层事务的回滚。
只读事务
- isReadOnly:配置事务是否是只读事务
- 事务超时
TIMEOUT_DEFAULT 事务的超时时间,需要底层数据库支持才能使用此配置,-1代表无限制。
事务传播行为指的就是当一个业务方法【被】 另一个业务方法调用时,应该如何进行事务控制。
总结:Spring中的事务控制主要就是通过这三个API实现的
PlatformTransactionManager 负责事务的管理,他是个接口,其子类负责具体工作
TransactionDefinition 定义了事务的一些相关参数
TransactionStatus 代表事务运行的一个实时状态
可以简单的理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态。