事务隔离和Spring事务传播特性

事务隔离

事务的四大特性

原子性

一致性

隔离性

持久性

四种事务隔离级别

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
幻读是指用户在读取某一行数据时,另一个事务又在该范围内插入了新行,当用户再次读取该范围数据行时,会出现新的"幻影行"