2011-05-26 78 views
1

讓我們想象一下我有一個H2數據庫表T.兩個進程A和B進行交易找出當行已經在H2數據庫表被修改

進程A執行CRUD(創建,讀取,更新,刪除)在T上。

過程B想要知道T中的行L何時最後被修改(即B提供了例如System.currentTimeMillis()值)。

可以在T中創建一個列,記錄每行的最後修改時刻,但是我想知道H2是否已經在某處存儲了這些信息以及它是否可以訪問。

回答

2

據我所知在H2中沒有這樣的功能(也可能不在任何RDBMS中)。原因很簡單 - 每個記錄額外4或8個字節可能會對整體數據庫大小產生巨大影響,特別是對於小記錄。也會有輕微的性能影響。

但通過使用額外列和更新觸發器來實現此功能相對簡單。也有一些數據庫可能進一步簡化它,像MySQL:

ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 

也請數據庫服務器的時鐘,工藝時鐘和進程B的時鐘區分。在現實世界中,他們很可能不會一樣。

+0

我想爲我的下一步是找出這是否可以實現自動化。謝謝。 – JVerstry 2011-05-26 19:30:30

+1

'src/test/org/h2/samples'中有一些觸發器示例。 – trashgod 2011-05-26 19:46:40

0

數據庫只存儲您設置的內容。

因此,您必須設置表以存儲修改時間,並且一個非常簡單的方法是通過創建值爲now()的「計算列」,計算列在每次記錄被修改時被評估。

CREATE TABLE TEST(ID INT, NAME VARCHAR, LAST_MOD TIMESTAMP AS NOW()); 

FYI:http://www.h2database.com/html/features.html#computed_columns