03.07 sql数据库为什么会经常锁表?

李原草


对于开发运维和DBA而言,数据库锁表现象并不陌生。当遇到锁表时并没有什么好办法,只能多做检查,当然了这种检查也不是漫无目的的检查。

数据库为什么要锁表?

我们知道,数据库会涉及到多人读取和写入,数据库为了保证ACID特性(原子性、一致性、隔离性、持久性)会对数据做相应保护措施(锁表)。通俗来说就是,为了防止在数据变更时别人也在同时变更,就需要把表先锁住不让别人修改,等数据修改完毕后再释放锁。

长时间锁表容易导致死锁

如果某个表长时间处于锁定状态,那可能是竞争资源引起了进程死锁(即:多个进程互相在等待对方释放锁)。导致数据库长时间锁定/死锁表的可能因素主要有:

1、事务处理时间较长,在并发较大情况下容易导致死锁;

2、表未加索引导致全表扫描,耗时较久;

3、多个进程间存在循环等待条件,每个都占用对方申请的下一个资源。

如何定位被锁住的表?

不同数据库定位锁表的方法不尽相同,此处以SQL Server为例看看如何定位被锁的表。SQL Server可通过SQL Server Profiler检测工具来查找,步聚如下:

以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

网络圈


真相只有一个!你的设计太水了。。

我在有一个问题《数据库什么时候会死锁》的回答中提到了,数据库为了保证数据的一致性,防止并发对数据正确性的影响,通常会使用加锁的方式!

而一共有表级锁,行级锁和页面锁三种锁粒度,锁又有共享锁(通常用于读数据)和独占锁(通常用于写数据)等的区分!


关于数据库锁机制发生死锁的原因,请参考我的那篇回答,回到这个提问上来,为什么数据库经常锁表?

锁表的意思很明显,就是表数据被锁,导致其他事务访问不到表中的数据!可能原因有哪些呢?

1,字段不加索引:在执行事务的时候,如果表中没有索引,会执行全表扫描,如果这时候有其他的事务过来,就会发生锁表!

2,事务处理时间长:事务处理时间较长,当越来越多事务堆积的时候,会发生锁表!

3,关联操作太多:涉及到很多张表的修改等,在并发量大的时候,会造成大量表数据被锁!


出现锁表应该怎么解决呢?

1,通过相关的sql语句可以查出是否被锁定,和被锁定的数据!

2,为加锁进行时间限定,防止无限死锁!

3,加索引,避免全表扫描!

4,尽量顺序操作数据!

5,根据引擎选择合理的锁粒度!

6,事务中的处理时间尽量短!

生产中出现死锁等问题是比较严重的问题,因为通常死锁没有明显的错误日志,只有在发现错误的时候才能后知后觉的处理,所以,一定要尽力避免!


由于篇幅原因,就不再赘述,改天再写下数据库锁的机制和死锁原因和解决方案,敬请关注。。


分享到:


相關文章: