事务隔离
事务的四大特性
原子性
一致性
隔离性
持久性
四种事务隔离级别
Read Uncommitted
读取未提交内容
会出现脏读
Read Committed
读取提交内容 Nonrepeatable Read 不可重复读
Read Committed满足了隔离的定义: 一个事务只能看到其他事务已提交的操作
因为两次读取数据库某条数据时,数据可能会不一致(两次读取之间,该数据被其他事务改动),所以也被称为Nonrepeatable Read
(这个是mysql默认的事务隔离级别)
Repeatable Read
可重读
确保同一事务获取到的数据是一致的
不过会导致另一个问题: 幻读
Serializable
可串行化
最高级别的事务隔离,通过强制事务排序使之不可能相互冲突,从而解决幻读问题.简而言之,它是在每个读的数据上加上共享锁.在这个级别可能导致大量的超时现象和锁竞争
总结
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | x | √ | √ |
Repeatable Read | x | x | √ |
Serializable | x | x | x |
Spring事务传播特性
required
Propagation.REQUIRED
方法被调用是自动开启事务,在事务范围内则使用同一事务,否则开启新事务
requires_new
Propagation.REQUIRES_NEW
无论如何自身都会开启新事务
supports
Propagation.SUPPORTS
自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务.
not_supported
Propagation.NOT_SUPPORTED
自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务.
mandatory
Propagation.MANDATORY
自身不开启事务,必须在事务环境中否则报错.
never
Propagation.NEVER
自身不会开启事务,在事务范围内使用抛出异常.
nested
Propagation.NESTED
如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动事务,按照required执行.
名词解释
脏读
Dirty Read
读取其他事务未提交的执行结果
幻读
Phantom Read
幻读是指用户在读取某一行数据时,另一个事务又在该范围内插入了新行,当用户再次读取该范围数据行时,会出现新的"幻影行"