2011-11-22 66 views
0

我有一個表設置數列,我保留一個計數器acording到「DOCUMENT_TYPE」從計數器表中同一事務

TABLE: document_counter 
document_type = "general" 
last_number = 100 

TABLE: document 
document_id 
document_number 
document_type 
description 
... 

什麼是正確的方式,如果我需要建立一個處理事務新的「文件」,但放在「document_number」下一個可用的號碼?我應該做兩次交易還是如何?

+0

要創建新文檔,請使用document_counter.last_number值作爲document_number,然後增加document_counter? –

+0

是的,但如果在一個交易中可能。我不想要的是如果在保存和事務回滾期間遇到任何問題,請增加document_counter.last_number – dimirc

回答

0

你開始一個交易,做所有的更新,然後如果一切正常,提交;否則,回滾。僞代碼:

start transaction; 
select last_number from document_counter; 
insert into document (...) values (...); 
update document_counter set last_number = last_number + 1; 
commit; 
+0

但是,如果「insert into document(...)values(...);」其他交易還選擇了last_number? – dimirc

1

John Watson是正確的,一個事務應該是你需要的。

根據您正在使用的dbms,如果您通過更新文檔計數器然後讀取新的數字開始,可以鎖定該行以供讀取。

只有當您提交當前事務後,下一個事務才能訪問它,因此獲取正確的下一個數字。