为了账号安全,请及时绑定邮箱和手机立即绑定

读提交和可重复读之间的区别

读提交和可重复读之间的区别

SMILET 2019-11-04 15:16:12
我认为上述隔离级别是如此相似。有人可以用一些很好的例子来描述主要区别是什么吗?
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

可重复读

从事务开始就维护数据库的状态。如果您在会话1中检索到一个值,则在会话2中更新该值,然后在会话1中再次检索该值将返回相同的结果。读取是可重复的。


session1> BEGIN;

session1> SELECT firstname FROM names WHERE id = 7;

Aaron


session2> BEGIN;

session2> SELECT firstname FROM names WHERE id = 7;

Aaron

session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;

session2> SELECT firstname FROM names WHERE id = 7;

Bob

session2> COMMIT;


session1> SELECT firstname FROM names WHERE id = 7;

Aaron

阅读已提交

在事务的上下文中,您将始终检索最近提交的值。如果您在会话1中检索到一个值,在会话2中对其进行更新,然后再次在会话1中对其进行检索,则将获得在会话2中修改的值。它读取最后提交的行。


session1> BEGIN;

session1> SELECT firstname FROM names WHERE id = 7;

Aaron


session2> BEGIN;

session2> SELECT firstname FROM names WHERE id = 7;

Aaron

session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;

session2> SELECT firstname FROM names WHERE id = 7;

Bob

session2> COMMIT;


session1> SELECT firstname FROM names WHERE id = 7;

Bob

说得通?


查看完整回答
反对 回复 2019-11-04
?
jeck猫

TA贡献1909条经验 获得超7个赞

根据我对这个线程的理解和理解,答案很简单,而@ remus-rusanu答案则基于以下简单场景:

进程A和B有两个。进程B正在读取表X进程A正在写入表X进程B正在再次读取表X。

  • ReadUncommitted:进程B可以从进程A读取未提交的数据,并且基于B的写入可以看到不同的行。完全没有锁

  • ReadCommitted:进程B只能从进程A读取已提交的数据,并且基于仅COMMITTED B的写入,它可以看到不同的行。我们可以称之为简单锁吗?

  • RepeatableRead:无论进程A在做什么,进程B都将读取相同的数据(行)。但是进程A可以更改其他行。行级块

  • 可序列化的:进程B将读取与以前相同的行,并且进程A无法在表中读取或写入。表级块

  • 快照:每个进程都有自己的副本,并且正在使用它。每个人都有自己的看法


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 3580 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信