DB2事务如何在并发情况下正常工作

时间:2013-04-08 15:41:09

标签: concurrency transactions db2

这里有2个表employee(empID int,empName varchar,age int)和salary(salID,empID,...)。

  1. insert into employee select ... where not exists (select 1 from employee where empID = :employeeID)

  2. insert into salary ....

  3. ...
  4. 有2个作业与上述逻辑和SAME员工同时运行。

    • job1失败并回滚。
    • job2在job1回滚之前启动,并在job1回滚后提交。

    我的问题是:

    1. 如果job2成功完成,将在employee表中插入多少条记录? 1还是0? 更准确地说,job2的第1步可以看到job1插入的员工记录吗?
    2. 如果为0,如何确保job2插入员工或者job1回滚不会删除?

1 个答案:

答案 0 :(得分:0)

  

如果job2成功完成,将在employee表中插入多少条记录? 1还是0?

1

  

更准确地说,job2的第1步可以看到job1插入的员工记录吗?

由于您说回滚了job1,因此job1没有插入员工记录。

job1告诉数据库,“我想插入员工记录。”然后,DB2在行,页面或表上放置写锁定。定义表后,数据库分析员(DBA)确定表写入锁定的级别。默认为page。

只要写锁定存在,除非读取隔离级别是未提交读取,否则没有其他事务可以读取插入。我们假设这不是这种情况。

job2必须等待job1提交或回滚,然后db2才允许job2查看job1的行。在job1回滚后,将删除写锁定,并允许job2继续。

  

如何确保job2插入员工或者job1回滚不会删除员工?

DB2将不允许job2在回滚job1之后执行插入。

顺便说一句,这种问题(两个尝试插入同一行的事务)可能导致DB2死锁,其中两个事务都将被回滚。同样,这假设事务(作业)具有比未提交的读取更高的读取隔离级别。