共享锁浅析

共享锁浅析

  • 1 前言
  • 2 共享锁(s锁)

1 前言

数据库大并发操作要考虑死锁和锁的性能问题,看到网上大都语焉不详,在这里我想重新梳理一下共享锁,这里用T1代表数据库执行请求,T2代表另一个请求,T3,T4以此类推。

2 共享锁(s锁)

T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象) T2: update table set column1=‘hello’ 过程: T1运行 (加共享锁) T2运行 If T1 还没执行完 T2等… else 锁被释放 T2执行 endif T2之所以要等,是因为T2在执行update前,试图对table表加一个排他锁, 而数据库规定同一资源上不能同时共存共享锁和排他锁。所以T2必须等T1 执行完,释放了共享锁,才能加上排他锁,然后才能开始执行update语句。

T1: select * from table T2: select * from table 这里T2不用等待T1执行完,而是可以马上执行。 分析: T1运行,则table被加锁,比如叫lockA T2运行,再对table加一个共享锁,比如叫lockB。 两个锁是可以同时存在于同一资源上的(比如同一个表上)。这被称为共享锁与共享锁兼容。这意味着共享锁不阻止其它session同时读资源,但阻 止其它session update。

T1: select * from table T2: select * from table T3: update table set column1=‘hello’ 这次,T2不用等T1运行完就能运行,T3却要等T1和T2都运行完才能运行。 因为T3必须等T1和T2的共享锁全部释放才能进行加排他锁然后执行update 操作。

以上是自己对于共享锁的简单记录,以后再来详细理一下各种锁。

你可能感兴趣的:(MySQL)