这里有2个表employee(empID int,empName varchar,age int)和salary(salID,empID,...)。
insert into employee
select ...
where not exists (select 1 from employee where empID = :employeeID)
insert into salary ....
有2个作业与上述逻辑和SAME员工同时运行。
我的问题是:
答案 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死锁,其中两个事务都将被回滚。同样,这假设事务(作业)具有比未提交的读取更高的读取隔离级别。