开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1092|回复: 11
收起左侧

[完成] mysql数据库行锁问题

 关闭 [复制链接]
结帖率:33% (2/6)
发表于 2023-11-11 16:22:04 | 显示全部楼层 |阅读模式   广东省东莞市
50精币
请教下。 1.bmp 我这是执行了一个行锁。按理说别的进程操作这个表的话。只有这一个记录不能写。但现在为什么整个表都只能读不能写

最佳答案

查看完整内容

感觉楼上的回答都太扯淡了。 楼主。你的问题应该在于你行锁的列 没有做索引。。导致的全盘查找。 补充内容 (2023-11-11 19:34): 如果你的ID是主键的话。则不会出现这个问题。但不排除你没有设置主键的情况存在。

结帖率:65% (36/55)

签到天数: 20 天

发表于 2023-11-11 16:22:05 | 显示全部楼层   河北省石家庄市
感觉楼上的回答都太扯淡了。 楼主。你的问题应该在于你行锁的列 没有做索引。。导致的全盘查找。

补充内容 (2023-11-11 19:34):
如果你的ID是主键的话。则不会出现这个问题。但不排除你没有设置主键的情况存在。

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:95% (18/19)
发表于 2023-11-11 16:26:41 | 显示全部楼层   湖北省武汉市
因为事务是针对整个数据库的好像
回复

使用道具 举报

结帖率:33% (2/6)

签到天数: 4 天

 楼主| 发表于 2023-11-11 16:28:54 | 显示全部楼层   广东省东莞市
冬夏 发表于 2023-11-11 16:26
因为事务是针对整个数据库的好像

应该不是。看了半天网上说的。加锁好像要加事务的
回复

使用道具 举报

结帖率:33% (2/6)

签到天数: 4 天

 楼主| 发表于 2023-11-11 16:29:41 | 显示全部楼层   广东省东莞市
冬夏 发表于 2023-11-11 16:26
因为事务是针对整个数据库的好像

如果不加事务的话。这语句执行完就失效了
回复

使用道具 举报

结帖率:95% (56/59)

签到天数: 21 天

发表于 2023-11-11 16:31:11 | 显示全部楼层   福建省宁德市
开始事务后面要加上提交事务
回复

使用道具 举报

结帖率:33% (2/6)

签到天数: 4 天

 楼主| 发表于 2023-11-11 16:35:13 | 显示全部楼层   广东省东莞市
鹏书 发表于 2023-11-11 16:31
开始事务后面要加上提交事务

我的目的是要锁住这行。现在我加的是读锁。按正常来说。不提交之前这行是锁住别的进程不能写的。但现在问题是别的进程连别的记录也不能写。堵塞了
回复

使用道具 举报

结帖率:0% (0/1)

签到天数: 6 天

发表于 2023-11-11 16:59:36 | 显示全部楼层   日本
在 MySQL 中,行锁是通过使用 FOR UPDATE 或 LOCK IN SHARE MODE 语句来实现的。这种锁定方式会锁定所选行,防止其他事务对这些行进行写操作。如果你执行了行锁,但整个表都不能写入,可能有几种原因:

事务未提交或回滚: 如果你的事务没有显式地提交或回滚,那么行锁可能一直存在。其他事务在这种情况下可能无法写入整个表,因为它们需要等待行锁的释放。
事务超时: 如果你的事务在执行时发生错误或超时,它可能会保留行锁,阻止其他事务写入表。检查事务是否正常完成,或者手动回滚事务。
未使用事务: 如果你没有使用事务,而是直接执行 FOR UPDATE 或 LOCK IN SHARE MODE,可能会导致整个表被锁定。确保在事务中使用这些语句。
其他事务持有写锁: 有可能有其他事务已经持有了写锁,导致表无法写入。这种情况下,你需要等待其他事务完成或手动终止它们。
回复

使用道具 举报

结帖率:33% (2/6)

签到天数: 4 天

 楼主| 发表于 2023-11-11 17:08:19 | 显示全部楼层   广东省东莞市
星星点点 发表于 2023-11-11 16:59
在 MySQL 中,行锁是通过使用 FOR UPDATE 或 LOCK IN SHARE MODE 语句来实现的。这种锁定方式会锁定所选行 ...

感谢。确实我测试的时候是没提交事务的。但我的本意是想这个事务流程没跑完之前。别的线程想操作别的记录。这有办法实现吗。如果要等到这个事务提交后别的线程才能操作的话。就不能并发处理了。等于说如果我有N个要操作的不同ID记录  都是要排队的了  
回复

使用道具 举报

结帖率:0% (0/1)

签到天数: 6 天

发表于 2023-11-11 17:34:16 | 显示全部楼层   广东省深圳市
莞科计算机信息 发表于 2023-11-11 17:08
感谢。确实我测试的时候是没提交事务的。但我的本意是想这个事务流程没跑完之前。别的线程想操作别的记录 ...

在 MySQL 中,事务的隔离级别(Isolation Level)可以用来控制事务之间的可见性和并发性。不同的隔离级别提供不同程度的数据隔离,从而影响事务的并发行为。

MySQL 提供了四个标准的隔离级别:

READ UNCOMMITTED(读未提交): 允许事务读取其他事务未提交的数据。这是最低的隔离级别,可能导致脏读、不可重复读和幻读。

READ COMMITTED(读已提交): 允许事务读取其他事务已提交的数据。这是大多数数据库系统的默认隔离级别,能够避免脏读,但仍可能导致不可重复读和幻读。

REPEATABLE READ(可重复读): 保证在事务执行期间同一cha询的结果是一致的。它避免了脏读和不可重复读,但仍可能导致幻读。

SERIALIZABLE(串行化): 提供最高的隔离级别,通过对事务进行完全隔离来防止所有并发问题。但是,这可能导致性能下降,因为它阻止了大量的并发。

在你的情况下,如果希望等待当前事务提交后其他事务才能操作相关记录,你可能需要将隔离级别设置为 SERIALIZABLE。在 MySQL 中,可以使用以下语句设置隔离级别:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
或者在启动事务时使用:
START TRANSACTION ISOLATION LEVEL SERIALIZABLE;

请注意,将隔离级别设置为 SERIALIZABLE 可能会导致性能下降,因为它会限制并发性。因此,在选择隔离级别时,需要权衡事务的一致性和性能需求。

点评

标准的Chat GPT答案。   湖南省邵阳市  发表于 2023-11-11 17:38
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表