免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5579 | 回复: 6
打印 上一主题 下一主题

mysql原子性问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-12 03:51 |只看该作者 |倒序浏览
sql语句如下:

update table1 set table1.name='john' where table1.id=1 and exists (select name from table2 where name='john' and sex='man')

意思是,当table2中john这行的sex属性为man的条件下,将table1的id=1这行的name设置为john

不知道mysql是否保证上面整条sql语句在执行时是原子操作,如果不是原子的,可能会出现在查询table2条件为真的瞬间,别人把john的sex属性修改了,但因为子查询已经返回为真,update操作还是会执行,这样就错了。

如果子查询不能保证原子,mysql里用join能保证原子性么?

谢谢

论坛徽章:
0
2 [报告]
发表于 2009-09-13 21:13 |只看该作者
可以理解为两个事务

事务1:update table1.name

事务2:update table2.sex

事务是可串行化,满足原子性需求

论坛徽章:
0
3 [报告]
发表于 2009-09-14 13:29 |只看该作者
楼上的意思不太清楚。

是子查询不保证原子性,要用2个事务去解决么?

论坛徽章:
0
4 [报告]
发表于 2009-09-14 14:57 |只看该作者
update 一个事务

别人把john的sex属性修改 是一个事务

子查询应该不会影响

论坛徽章:
0
5 [报告]
发表于 2009-09-15 10:49 |只看该作者
这么说,update第一个表的时候,mysql会把子查询里所涉及的表,或者行,同时锁住?

论坛徽章:
0
6 [报告]
发表于 2009-09-15 11:12 |只看该作者
lz如果担心的话,就用start transaction/commit把语句包起来

论坛徽章:
0
7 [报告]
发表于 2009-09-17 10:15 |只看该作者
第一个update会锁住相关记录吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP