MySQL数据库锁机制的相关原理
在一个update和insert操作频繁的表中,少量数据测试的时候运行良好,在实际运营中,因数据量比 较大(21万条记录),会出现死锁现象,用show processlist查看,可以看到一个update语句状态是 Locked,一个delete语句状态是Sending data。查看了一下参考手册,把锁定相关的资料整理下来,以便 自己记录和追踪该问题的解决情况:
MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB 表进行行级锁定 。在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型 就比另一个好。一切取决于应用程序,应用程序的不同部分可能需要不同的锁类型。为了确定是否想要使 用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。例如,大多数 Web应用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。基 本MySQL MyISAM设置已经调节得很好。 在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请 求所有必要的锁定并且总是以同样的顺序锁定表来管理。 对WRITE,MySQL使用的表锁定方法原理如下: ◆ 如果在表上没有锁,在它上面放一个写锁。 ◆否则,把锁定请求放在写锁定队列中。 对READ,MySQL使用的锁定方法原理如下: ◆如果在表上没有写锁定,把一个读锁定放在它上面。 ◆否则,把锁请求放在读锁定队列中。 当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。 这意味着,如果你在一个表上有许多更新,select语句将等待直到没有更多的更新。 如果insert 语句不冲突,可以自由为MyISAM 表混合并行的insert 和select 语句而不需要锁定。 InnoDB 使用行锁定,BDB 使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语 句处理期间,InnoDB 自动获得行锁定,BDB 获得页锁定,而不是在事务启动时获得。 行级锁定的优点: · 当在许多线程中访问不同的行时只存在少量锁定冲突。 · 回滚时只有少量的更改。 · 可以长时间锁定单一的行。 (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |