事务的隔离级别理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PYXLY1314/article/details/50915073

事务隔离级别出现的原因,以及隔离级别能解决的并发问题


选择完隔离级别与设计完事务之后,在使用过程中常常会遇到以下几种情况:

1.更新丢失(Lost update):两个事务同时更新,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。

2.脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。

3.不可重复读取(Non-repeatable Reads):一个事务两次读取,但在第二次读取前另一事务已经更新了。

4.虚读(Phantom Reads):一个事务两次读取,第二次读取到了另一事务插入的数据。

5.两次更新问题(Second lost updates problem):两个事务都读取了数据,并同时更新,第一个事务更新失败。

隔离级别(低->高)

● 未授权读取(Read Uncommitted)

扫描二维码关注公众号,回复: 3774419 查看本文章

允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

● 授权读取(Read Committed)

允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

● 可重复读取(Repeatable Read)

禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

● 序列化(Serializable)

提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。



猜你喜欢

转载自blog.csdn.net/PYXLY1314/article/details/50915073