SQL 多个事务并发提交,导致出现脏数据写入??

2017-11-13 09:43:48 +08:00
 WhyAreYouSoSad

是这样的,同一时间内出现多个 Request 进来,同时提交了多组数据进数据库。操作的是同一个表。导致有一些不符合规则的被写进数据库。具体操作如下

begin tran Tran1

insert into table A //因为并发,导致程序里生产的主键重复,所以 A 没插入成功

insert into table B //是 A 的子表

if(@@error==0)

begin
COMMIT TRAN Tran1 return 0;

end

else
begin
ROLLBACK TRAN Tran1
return -1; end

大致就是上面这个操作。后面产生的结果是,别的事务的脏数据(B 表的那些,A 主键重复)插入到事务成功的 Insert 数据里。如何做才能避免这种错误

3594 次点击
所在节点    程序员
7 条回复
infoflow
2017-11-13 09:48:28 +08:00
A 没插成功就不要继续插入 B 了,马上回滚事务。
xmh51
2017-11-13 10:18:30 +08:00
导致程序里生产的主键重复 这段能再详细点吗? 建议主键不要在程序生成的,用数据库里面的主键生成。
nullcc
2017-11-13 10:26:31 +08:00
可能是数据库的事务隔离级别的问题,你可以尝试把提交读(RC)改为可重复读(RR)试试。
fuyufjh
2017-11-13 10:33:22 +08:00
1 楼正解
Hozzz
2017-11-13 11:23:15 +08:00
锁机制的问题,执行 DML 操作的时候难道不是锁行或锁表吗?
WhyAreYouSoSad
2017-11-13 11:52:45 +08:00
@nullcc #3 为什么要改成可重复读?
klgd
2017-11-13 15:10:39 +08:00
if(@@error==0) 判断谁的 error ?不管是 insert A 还是 B,结果都应该在判断条件里的

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

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

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

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

© 2021 V2EX