悲观锁在数据库中如何工作,隔离级别与它有什么关系吗?

Nis*_*hat 6 mysql database locking isolation-level pessimistic-locking

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

会话 1:
t1:打开事务:
t2:睡眠(3 秒)
t5:updte 用户集 name='x' 其中 id =1

会话 2:t2:更新用户集 name='y' 其中 id=1

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

Sha*_*dow 4

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

  1. 由于乐观锁意味着事务中读取的记录没有被锁定,因此无法实现乐观锁。你不应该真正使用这个术语optimistic lockoptimistic concurrency control而是使用。悲观锁策略是一种涉及数据库级锁的策略,所有使用事务的 RDBMS 都实现了这种策略 - 包括 mysql 和 innodb。

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

  1. 隔离级别不会影响问题中描述的场景的结果,因为那里没有选择,只有 2 个原子更新,并且子句中引用的字段where未更新

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

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