2013-04-08 69 views
0

这里有两个表employees(empID int,empName varchar,age int)和salary(salID,empID,...)。DB2事务如何在并发情况下正常工作

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

  2. insert into salary ....

  3. ...

有以上的逻辑和同一员工同时运行2点的工作。

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

我的问题是:

  1. 如果作业2顺利完成,有多少记录将被插入到employee表? 1还是0?更准确地说,job2的第1步可以查看job1插入的员工记录吗?
  2. 如果为0,我如何确保员工被job2插入或不会被job1回滚删除?
+1

啊,并发性,理智的祸害。结果很大程度上取决于所选的锁定/隔离级别 - 在“正确”(可能是错误的)级别下,子查询可能会锁定_entire table_这使得它是连续的,这意味着您可能只有一个作业(它必须,否则你当然可以添加满足条件的东西...)。你在这里试图做什么?另外,存储“年龄”会让你陷入麻烦 - 你怎么知道他们什么时候长大一岁? – 2013-04-08 15:59:46

回答

0

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

更准确地说,可以一步JOB2的1看到JOB1插入的雇员记录?

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

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

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

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

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

在job1被回滚后,DB2将不允许job2执行插入操作。

顺便说一句,这类问题(两个事务试图插入同一行)可能导致DB2死锁,在这两个事务将被回滚。同样,这假定事务(作业)的读取隔离级别高于未提交的读取。

+0

谢谢!这非常有帮助。 – bruce 2013-04-09 09:54:15

相关问题