您的位置:首页 > 编程语言 > Java开发

数据库隔离级别以及Spring事务传播

2017-05-08 20:34 281 查看

数据库隔离级别

说这个问题之前我们先说说三个概念。

脏读

当一个事务正在访问数据,并且对数据进行了修改,但这个修改了的数据还没提交到数据库中,然后另一个事务也访问了这个数据,那么我们就称这个事务读到的数据是脏数据。这个错误过程就叫脏读。

不可重复读

同一个事务内,多次读同一个数据。在这个事务还没结束时,另一个事务也访问这条数据并做了修改最后提交了修改数据。那么第一个事务可能在某次读的数据和之前的数据不同,这个问题就叫不可重复读。

幻读

当一个事务查询了某个表的所有数据,这时一个事务向这张表插入一条记录,当前一个事务再次读取数据时,发现多了一条记录,就像出现了幻觉一样。

可能很多人会不清楚不可重复读和幻读的区别。我个人的理解是,不可重复读重在更新某一条记录,即避免它只需要行级锁就行。而幻读则重在插入删除,避免它需要锁住整张表。这纯属个人理解,如若有误,请指出。

四种隔离级别



读未提交
所有事务都可以看到其它未提交事务的执行结果。这一级别很少用在项目中,会出现上面三种错误情况。

读已提交
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的,MySQL是Repeatable Read)。一个事务只能看见已经提交事务所做的改变。但它只能避免脏读。

可重复读
这是MySQL的默认事务隔离级别。一旦事务在读取某条数据时,就会禁止别的事务修改它。它避免了不可重复读这一问题,但依旧会出些幻读。

可串行化
事务串行执行,有先后顺序,肯定不会出问题啦,就是效率较低。



Spring中的事务隔离

ISOLATION_DEFAULT
默认使用数据库当前的隔离级别。

ISOLATION_READ_UNCOMMITTED
读未提交。

ISOLATION_READ_COMMITTED
读已提交

ISOLATION_REPEATABLE_READ
可重复读

ISOLATION_SERIALIZABLE
可串行化

Spring事务传播

事务的特性

事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。



传播行为



下面是Spring配置事务传播和事务隔离的一个小例子:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 事务 Spring