问个 Sql 的问题,修改 一张表需要避免另一张表被修改,该怎么实现?

2020-10-23 18:31:04 +08:00
 Aruforce
	
UPDATE
	ab
set
	pta = x ,
	version = version + 1
where
	id = x
	and 100 = (
	select
		sum(pta)
	from
		abf
	where
		abf.ab_id = x )

不知道 上面的 SQL 是否可行? read commited

后面的 abf 是否会被锁表?或者该怎么查看这句 SQL 的或者给点关键字 也行

1556 次点击
所在节点    程序员
9 条回复
Aruforce
2020-10-23 18:32:38 +08:00
求救 dalao
wangyanrui
2020-10-23 19:48:43 +08:00
猜测不会,蹲个大佬
另:执行前上个锁呗😂😂
dbolo123
2020-10-23 22:11:51 +08:00
你想问 select for update ?
Aruforce
2020-10-24 09:34:49 +08:00
@dbolo123 不是 select for update 只能锁定已存在的数据 并不能防止新增…我是想避免另一张表被更新…
Leigg
2020-10-24 10:51:26 +08:00
一条 SQL 是原子执行,你提的问题暴露你对 mysql 的生疏程度
juzi214032
2020-10-24 21:08:38 +08:00
你可以直接对另一张表加锁,lock tables
Aruforce
2020-10-24 21:12:07 +08:00
@Leigg 一句 sql 执行过程中 ,表也可能被其他的 SQL 改变啊
Aruforce
2020-10-24 21:14:30 +08:00
@juzi214032 试过 lock inshare model ,在 RC 并不能避免插入操作。。在 RR 倒是可以。。。
juzi214032
2020-10-25 23:36:23 +08:00
@Aruforce 不是 lock inshare model,lock inshare model 是行级锁,不是表锁,当然不能避免插入操作。用 LOCK TABLES 命令,就是表锁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/717977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX