悲观锁如何在数据库中工作,隔离级别是否与它有任何关系?

How Pessimistic lock works in database,does Isolation level has to do any thing with it?

我正在阅读有关数据库锁定(悲观,乐观)机制的文章,

会话 1:
t1:开放交易:
t2:睡眠(3 秒)
t5: updte user set name='x' where id =1

第 2 节: t2:update 用户集名称='y' where id=1

我的疑惑是: 1. t5 会发生什么 2. 它与隔离级别有什么关系吗?如果是,不同隔离级别的行为是什么。 3. database(mysql,oracle)是否只做悲观锁?

让我以相反的顺序回答你的问题,因为这样我就不必重复某些部分。

  1. 由于optimistic locking表示事务中读取的记录没有加锁,所以不能实现乐观锁。您不应该真正使用术语 optimistic lock,而是使用 optimistic concurrency control。悲观锁定策略是一种涉及数据库级锁定的策略,所有使用事务的 rdbms 都实现了这种锁定策略 - 包括 mysql 和 innodb。

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

  1. 隔离级别不会影响问题中描述的场景的结果,因为 there is no select there, only 2 atomic updates and the field referenced in the where clause is not updated

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

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