查询-插入问题。如何保证数据完整性?

madmanahong 2010-12-17 02:02:15
有这么一种情况,就是

1. select .. from .. where..
来查询一个人是否存在

2. insert ..
如果此人存在,那么就插入到另一个表中。


但是由于并发,导致session 2在session 1进行完第一步的时候,将此人删除了。
此时session 1还不知道,造成了session 1执行成功,插入了一条无效的数据(因为此人在session 2已经被删除了)

这种情况如何做呢?
...全文
97 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yun3948 2010-12-23
  • 打赏
  • 举报
回复
完全不懂。都是牛人
Tirecoed 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 madmanahong 的回复:]

引用 4 楼 iihero 的回复:
将事务隔离级设为可串行化,即可避免此问题。


到底是设置成串行化好呢?还是LOCK TABLES好呢?
[/Quote]
学习!……
iihero_ 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 madmanahong 的回复:]

引用 4 楼 iihero 的回复:
将事务隔离级设为可串行化,即可避免此问题。


到底是设置成串行化好呢?还是LOCK TABLES好呢?
[/Quote]
如果是MyISAM引擎,只能lock tables
如果是InnoDB引擎,可以通过设置隔离级来做。
zuoxingyu 2010-12-17
  • 打赏
  • 举报
回复
照楼主的意思是这样的吧

insert into tb2 select * from tb1 where userid=100;

这样的情况下,执行的过程中会给TB1加表锁,其他连接是不能够进行DELETE的。
madmanahong 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iihero 的回复:]
将事务隔离级设为可串行化,即可避免此问题。
[/Quote]

到底是设置成串行化好呢?还是LOCK TABLES好呢?
iihero_ 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 madmanahong 的回复:]
有这么一种情况,就是

1. select .. from .. where..
来查询一个人是否存在

2. insert ..
如果此人存在,那么就插入到另一个表中。


但是由于并发,导致session 2在session 1进行完第一步的时候,将此人删除了。
此时session 1还不知道,造成了session 1执行成功,插入了一条无效的数据(因为此人在sessio……
[/Quote]
将事务隔离级设为可串行化,即可避免此问题。
zz_d 2010-12-17
  • 打赏
  • 举报
回复
这是 同步 的问题了,在一个 session 获取或修改表的数据前, 先对该表加锁.
楼主可以好好看一下 "lock table" 方面的资料.
ACMAIN_CHM 2010-12-17
  • 打赏
  • 举报
回复
SESSION1, SESSION2 执行的语句都是什么?举例说明。
小小小小周 2010-12-17
  • 打赏
  • 举报
回复
事务或锁机制来实现.

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧