行锁
行锁的劣势:开销大;加锁慢;会出现死锁
行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强
加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁;当然我们也可以显示的加锁。
使用行锁的两大前提:innodb引擎并且开启事务。
使用行锁 必须使用索引作为检索条件进行数据检索,否则采用行锁会升级为表锁。(原因才考:https://www.cnblogs.com/chengxiansheng/p/11149625.html)
表锁
表锁的优势:开销小;加锁快;无死锁
表锁的劣势:锁粒度大,发生锁冲突的概率高,并发处理能力低
加锁的方式:自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁。也可以显示加锁。
表锁使用方式:
加锁:LOCK TABLES table_name [READ | WRITE];
释放锁:UNLOCK TABLES;
django中使用示例:
from django.db import connection
def demo():
...
cursor = connection.cursor()
cursor.execute("LOCK TABLES interview WRITE")
try:
....
time.sleep(30)
finally:
cursor.execute("UNLOCK TABLES;")
...
表锁为READ:
表的READ锁具有以下功能:
- 同时可以通过多个会话获取表的
READ
锁。此外,其他会话可以从表中读取数据,而无需获取锁定。 - 持有
READ
锁的会话只能从表中读取数据,但不能写入。此外,其他会话在释放READ
锁之前无法将数据写入表中。来自另一个会话的写操作将被放入等待状态,直到释放READ
锁。 - 如果会话正常或异常终止,MySQL将会隐式释放所有锁。这也与
WRITE
锁相关。
表锁为WRITE:
表锁为WRITE
具有以下功能:
- 只有拥有表锁定的会话才能从表读取和写入数据。
- 在释放
WRITE
锁之前,其他会话不能从表中读写。