• 请不要在回答技术问题时复制粘贴 AI 生成的内容
WhyAreYouSoSad
V2EX  ›  程序员

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

  •  
  •   WhyAreYouSoSad · Nov 13, 2017 · 4720 views
    This topic created in 3277 days ago, the information mentioned may be changed or developed.

    是这样的,同一时间内出现多个 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 数据里。如何做才能避免这种错误

    7 replies  •  2017-11-13 15:10:39 +08:00
    infoflow
    infoflow
    Nov 13, 2017
    1
    A 没插成功就不要继续插入 B 了,马上回滚事务。
    xmh51
    xmh51
    Nov 13, 2017
    2
    导致程序里生产的主键重复 这段能再详细点吗? 建议主键不要在程序生成的,用数据库里面的主键生成。
    nullcc
    nullcc
    Nov 13, 2017
    3
    可能是数据库的事务隔离级别的问题,你可以尝试把提交读(RC)改为可重复读(RR)试试。
    fuyufjh
    fuyufjh
    Nov 13, 2017
    4
    1 楼正解
    Hozzz
    Hozzz
    Nov 13, 2017
    5
    锁机制的问题,执行 DML 操作的时候难道不是锁行或锁表吗?
    WhyAreYouSoSad
    WhyAreYouSoSad
    OP
    Nov 13, 2017
    6
    @nullcc #3 为什么要改成可重复读?
    klgd
    klgd
    Nov 13, 2017
    7
    if(@@error==0) 判断谁的 error ?不管是 insert A 还是 B,结果都应该在判断条件里的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1310 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    ♥ Do have faith in what you're doing.