{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

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

baiybaiy 回答0 收藏1
收藏问题

2条回答

付伦

付伦

回答于2022-06-28 14:03

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

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

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

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

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

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

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

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

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

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

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

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

4,尽量顺序操作数据!

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

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

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

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

评论0 赞同0
  •  加载中...
bigdevil_s

bigdevil_s

回答于2022-06-28 14:03

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

数据库为什么要锁表?

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

长时间锁表容易导致死锁

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

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

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

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

如何定位被锁住的表?

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

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

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<