2013-04-08 70 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

相關問題