数据库锁

1.1锁的种类

  • 共享锁(Shared lock)
    顾名思义就是对于加锁的数据而言,多个查询语句是能够同时读取的。
  • 独占锁(Exclusive Locks)
    顾名思义就是对于加锁数据而言,一次只能有一条查询语句对其进行操作。
    注意,对于一条数据而言,共享是相对于共享锁而言的,如果后面需要加独占锁,此时仍然需要释放共享锁再加独占锁。

我们再考虑一种情况,假如两条查询语句
T1:update table set column1='hello' where id=10
T2:update table set column1='world' where id=20(这里di不是主键,查询的时候需要全局扫描。)就有可能产生死锁。

首先t1建立全局扫描加入共享锁,t2同样加入共享锁。(此时正常运行,两条共享锁)然后找到目标数据进行更新,更新需要获得排它锁。此时由于t2对数据加上了共享锁,所以需要等待t2释放共享锁。然而对于t2而言也是这样。他们互相等待就会产生死锁。那么怎么解决这个问题呢? 可以一开始就对其加上独占锁,不过这样大大减少了效率。另一种解决方案就是接下来我们要了解的更新锁:

  • 更新锁(Update lock)
    更新锁的意思是:“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁
    (用来更新)的资格”。一个事物只能有一个更新锁获此资格。

个人理解这里是破坏了循环等待条件,使得其中一条语句不需要等待其他资源,(相当于优先分配资源给拥有更新锁的对象,如果其他对象需获得共享资源,就得等到更新锁使用完成后才可以)

posted @ 2020-08-13 09:21  大嘤熊  阅读(124)  评论(0)    收藏  举报