数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

轻松掌握MySQL数据库锁机制的相关原理[1]


发布日期:2022年01月04日
 
轻松掌握MySQL数据库锁机制的相关原理[1]

在一个update和insert操作频繁的表中少量数据测试的时候运行良好在实际运营中因数据量比较大(万条记录)会出现死锁现象用show processlist查看可以看到一个update语句状态是Locked一个delete语句状态是Sending data查看了一下参考手册把锁定相关的资料整理下来以便自己记录和追蹤该问题的解决情况

MySQL 支持对MyISAM和MEMORY表进行表级锁定对BDB表进行页级锁定对InnoDB 表进行行级锁定在许多情况下可以根据培训猜测应用程序使用哪类锁定类型最好但一般很难说出某个给出的锁类型就比另一个好一切取决于应用程序应用程序的不同部分可能需要不同的锁类型为了确定是否想要使用行级锁定的存储引擎应看看应用程序做什么并且混合使用什么样的选择和更新语句例如大多数Web应用程序执行许多选择而很少进行删除只对关键字的值进行更新并且只插入少量具体的表基本MySQL MyISAM设置已经调节得很好

在MySQL中对于使用表级锁定的存储引擎表锁定时不会死锁的这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理

对WRITEMySQL使用的表锁定方法原理如下

◆ 如果在表上没有锁在它上面放一个写锁

◆否则把锁定请求放在写锁定队列中

对READMySQL使用的锁定方法原理如下

◆如果在表上没有写锁定把一个读锁定放在它上面

◆否则把锁请求放在读锁定队列中

当一个锁定被释放时锁定可被写锁定队列中的线程得到然后是读锁定队列中的线程

这意味着如果你在一个表上有许多更新SELECT语句将等待直到没有更多的更新

如果INSERT 语句不沖突可以自由为MyISAM 表混合并行的INSERT 和SELECT 语句而不需要锁定

InnoDB 使用行锁定BDB 使用页锁定对于这两种存储引擎都可能存在死锁这是因为在SQL语句处理期间InnoDB 自动获得行锁定BDB 获得页锁定而不是在事务启动时获得

行级锁定的优点

· 当在许多线程中访问不同的行时只存在少量锁定沖突

· 回滚时只有少量的更改

· 可以长时间锁定单一的行

行级锁定的缺点

· 比页级或表级锁定占用更多的内存

· 当在表的大部分中使用时比页级或表级锁定速度慢因为你必须获取更多的锁

· 如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表比其它锁定明显慢很多

· 用高级别锁定通过支持不同的类型锁定你也可以很容易地调节应用程序因为其锁成本小于行级锁定

在以下情况下表锁定优先于页级或行级锁定

· 表的大部分语句用于读取

· 对严格的关键字进行读取和更新你可以更新或删除可以用单一的读取的关键字来提取的一行

&#; UPDATE tbl_name SET column = value WHERE unique_key_col = key_value ;

&#; DELETE FROM tbl_name WHERE unique_key_col = key_value ;

· SELECT 结合并行的INSERT 语句并且只有很少的UPDATE或 DELETE 语句

· 在整个表上有许多扫描或 GROUP BY 操作没有任何写操作

[] []

               

上一篇:轻松掌握MySQL数据库锁机制的相关原理[2]

下一篇:数据库应用经验:如何简单安装MySQL数据库