0

这里有 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. ...

有 2 个作业与上述逻辑和相同的员工同时运行。

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

我的问题是:

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

1 回答 1

0

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

1

更准确地说,job2的step 1能看到job1插入的员工记录吗?

既然你说job1被回滚,那么job1没有插入员工记录。

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

只要有写锁,就没有其他事务可以读到这个插入,除非读隔离级别是未提交读。我们假设这里不是这种情况。

在 db2 允许 job2 看到 job1 的行之前,job2 必须等待 job1 提交或回滚。job1 回滚后,写锁被解除,job2 可以继续进行。

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

DB2 不允许 job2 执行插入操作,直到 job1 回滚。

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

于 2013-04-08T17:54:48.143 回答