mysql update 锁表 Waiting for table level lock

mysql update 锁表 Waiting for table level lock,第1张

故障原因

show processlist看到表出现Waiting for table level lock,导致后面表卡死,mysql占据cpu急剧升高,导致服务器卡死

解决方法

1.myisam引擎导致的,把myisam改为innodb

2.把msyql卡死进程kill掉

你的描述,应该就是锁表了,并不是卡死。检查是否for update 的 *** 作

我不知道你是什么检查锁表的,检查锁表时是否有用户名作为条件了?不加条件试试。

怀疑有可能是你 *** 作数据库用户这张表对其他用户进行授权了,被授权的用户进行删除,如果限制了username可能会查不到。

常规查询锁表方法如下:

查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode

SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,

s.terminal, s.logon_time, l.type

FROM v$session s, v$lock l

WHERE s.sid = l.sid

AND s.username IS NOT NULL

ORDER BY sid

这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,

任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

--杀掉进程 sid,serial#

例如锁表进程的sid = 210 , serial# = 11562,执行如下命令。

alter system kill session'210,11562'

希望对你有帮助,欢迎采纳!

MYSQL的UPDATE关于检查更新前后数据是否变化,只有数据变化的时候才真正进行更新 *** 作,例如你的语句:

update user set name='xiaoy' where id=1

如果id唯一、并且存在有1的记录,而且name上没有限制,那么执行结果有两种可能:

Rows matched: 1 Changed: 1 Warnings: 0

Rows matched: 1 Changed: 0 Warnings: 0

如果该记录以前的值就不是xiaoy,那么结果就是第一种,否则是第二种。MYSQL的这个设计,减少无畏了修改 *** 作,提高性能。

如果是name字段有约束导致更新失败,语句是会报错的;警告是字段类型或者长度等超限,导致更新时候进行了处置的情况;changed=0只是信息,连警告都不算。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8677645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存