悲观锁在数据库中是如何工作的?隔离级别与其有关吗?

6
我正在阅读关于数据库锁定(悲观、乐观)机制的内容,
Session 1:
t1:开启事务
t2:等待3秒
t5:更新id为1的user表中name为“x”
Session 2:
t2:更新id为1的user表中name为“y”
我的疑惑是:
1. 在t5发生什么?
2. 是否与隔离级别有关?如果是,不同隔离级别会有什么行为?
3. 数据库(mysql、oracle)是否只进行悲观锁定?
1个回答

4

让我倒序回答您的问题,因为这样我就不必重复某些部分。

  1. 由于 乐观锁定 意味着在事务中读取的记录未被锁定,因此无法实现乐观锁定。你真正应该使用术语 乐观并发控制,而不是 乐观锁定。悲观锁定策略是涉及数据库级别锁定的策略,所有使用事务的 rdbms 都会实现它们,包括具有 innodb 的 mysql。

Mysql没有任何关于乐观并发控制的数据库级别支持。这并不意味着其他 rdbms 也不支持 OCC。您需要查阅它们的手册。

  1. 隔离级别不会影响问题描述中的情况,因为那里没有查询操作,只有两个原子更新,并且where子句中引用的字段未被更新。

隔离级别主要影响事务读取数据的方式,而不是它们可以如何更新数据。

  1. 问题描述中的结果取决于哪个会话首先发出update命令以及该事务打开的时间。无论哪个会话首先执行更新操作,都将进行更改并在索引记录上设置独占锁定。其他事务将无法执行更新操作,直到第一个事务完成。如果第一个事务运行时间很长,那么等待锁定释放的其他事务可能会超时。

“Mysql在数据库层面上不支持乐观并发控制”这句话似乎已经不再适用了。 - undefined
@VyshnavRameshThrissur 我不知道MySQL是否提供对OCC的支持。如果你认为他们提供支持,请提供一个参考资料,以便我可以更新我的回答。 - undefined
我很快会更新。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接