乐观读和乐观写有什么区别?
或者更重要的是,有人能定义这4吗?
(a)乐观阅读
(b)悲观阅读
(c)乐观的写作
(d)悲观写作
在这里提到问题和答案:https://stackoverflow.com/questions/2741016/read-committed-snapshot-vs-snapshot-isolation-level
'READ提交的快照做乐观读和悲观写。相反,快照做乐观读和乐观写。
发布于 2018-05-01 11:58:04
添加本节基于@AppleBook89 89‘S的评论。
那么,比尔·帕茨克( Bill )说:“读到的快照是乐观的读,悲观的写是什么意思?”
读取操作不获取正在读取的数据上的共享(S)锁,因此不阻止正在修改数据的事务。
要更新的行的选择使用阻塞扫描完成,其中在读取数据值时对数据行采取update (U)锁。这与不使用行版本控制的读提交事务相同.如果数据行不符合更新条件,则在该行上释放更新锁,并锁定并扫描下一行。
相反,快照可以读取和乐观地写到:“这就是我想要理解的。
请阅读上面相同的答案。
在快照隔离下运行的事务对数据修改采取乐观的方法,在执行修改之前先获取数据锁,然后才强制执行约束。否则,在修改数据之前不会获取数据上的锁。当数据行满足更新条件时,快照事务将验证数据行是否已被在快照事务开始后提交的并发事务修改。如果数据行已在快照事务处理之外修改,则会发生更新冲突并终止快照事务。更新冲突由数据库引擎处理,无法禁用更新冲突检测。
他的反应是如何让70+大拇指的?
我不知道:)
我会把你的问题改写成有人能定义:
悲观并发控制(或悲观锁定)被称为“悲观”,因为系统假定最坏的情况--假设两个或多个用户希望同时更新相同的记录,然后通过锁定记录来防止这种可能性,不管实际冲突的可能性有多小。一旦访问行的任何部分,锁就会被放置,这使得两个或多个用户不可能同时更新行。根据锁定模式(共享、独占或更新),即使已放置了锁,其他用户也可能能够读取数据。
乐观并发控制(或乐观锁定)假设虽然冲突是可能的,但它们将非常罕见。系统没有每次使用时锁定每一条记录,而只是查找两个用户确实试图同时更新同一记录的迹象。如果找到该证据,则会丢弃一个用户的更新,并通知该用户。
尽管乐观并发控制机制有时被称为乐观锁定,但它不是真正的锁定方案--当使用乐观并发控制时,系统不会放置任何锁。使用锁定一词是因为乐观并发控制通过防止重叠更新与悲观锁定具有相同的目的。
使用乐观锁定时,直到写入更新的数据之前,才会发现存在冲突。在悲观锁定中,一旦尝试读取数据,就会发现存在冲突。
我觉得肯德拉的这个解释很容易理解。
罗伯特·谢尔顿解释了常见的问题和误解。
参考资料:
发布于 2018-05-01 11:32:09
或者更重要的是,有人能定义这4吗?
不是的。这些都不是有精确定义的术语。“乐观并发”意味着进行一些更改,即使您以后可能无法保存或提交更改。“悲观并发”意味着在进行更改之前获取锁,以确保您能够保存/提交锁。
在Server中,在读取数据时,没有隔离级别使用独占锁定(尽管可以使用锁提示强制执行)。
RCSI和快照都使用悲观并发。您将始终获得更改所需的X锁,并在实际进行更改之前提交行。
客户端库通常使用乐观并发性,读取数据,在内存中更改数据,然后在保存时检查这些更改是否与其他会话更改相冲突。如果发现更改发生冲突,则会引发错误。见eg 乐观并发
在Server数据库引擎中,惟一的乐观并发性是由内存优化表引入的模型,这些表不需要锁来写入数据,而是使用第一作者-wins乐观并发模型,描述了这里。
https://dba.stackexchange.com/questions/205425
复制相似问题