zoukankan      html  css  js  c++  java
  • 表锁简介

    锁分为表锁和行锁:

    表锁开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度低。

    行锁开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

    不同的存储引擎支持的锁粒度不一样。InnoDB行锁和表锁都支持,MyISAM只支持表锁。InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB将使用表锁。InnoDB的行锁是基于索引的。

    表锁的模式:表读锁(table Read Lock)、表写锁(table WriteLock)

    请求锁模式是否兼容当前锁模式

    None

    读锁

    写锁

    读锁

    写锁

    在表读锁和表写锁的环境下:读读不阻塞,读写阻塞,写写阻塞。

    • 读读不阻塞:当前用户在读数据,其他用户也在读数据,不会加锁。
    • 读写阻塞:当前用户在读数据,其他用户不能修改当前用户读的数据,会加锁。
    • 写写阻塞:当前用户在修改数据,其他的用户不能修改当前用户正在修改的数据,会加锁。

    读锁和写锁是互斥的,读写操作是串行。如果某个进程想要获取读锁,同时另一个经常想要获取写锁,MySQL中写锁是优先于读锁的。

    写锁和读锁的优先级可以通过参数调节的:max_write_lock_count和low_priority_update。需要注意:

    • LOCAL修饰符允许其他会话在持有锁时执行非冲突的插入语句(并发插入)。但是如果打算在持有锁时使用服务器外部的进程操作数据库,则不能使用READ LOCAL。对于InnoDB表,READ LOCAL和READ是一样的。
    • MyISAM可以支持查询和插入操作的并发进行,可以通过系统变量concurrent_insert来指定哪种模式,在MyISAM中它默认是:如果MySIAM表中没有空洞(表中没有被删除的行),MySIAM允许在一个进程读表的同时,另一个进程从表尾插入记录。InnoDB存储引擎是不支持这个的。
    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 390 消除游戏
    Java实现 LeetCode 390 消除游戏
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14369489.html
Copyright © 2011-2022 走看看