2011-10-19 42 views
0

我正在嘗試在行上進行選擇並更新值。雖然我這樣做,我需要獨佔訪問該行。換句話說,沒有其他進程(VM內部或外部)應該能夠讀取該行,直到我更新該行之後。當前值不應該是「可選擇的」。我已經嘗試了以下事務註釋。使用Spring事務使用休眠的SQL Server獨佔行鎖(XLOCK ROWLOCK)

@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout=960) 

在Spring上下文中肯定能行,但同時把睡眠語句在事務的中間,我仍然可以選擇使用數據庫工具的當前行值。

有沒有辦法使用Spring/Hibernate獲取XLOCK/ROWLOCK(以適當的方式)?

版本:

  • 春:3.0.5.RELEASE
  • 休眠:3.6.3.Final
  • JTDS:1.2.4

如果我不能使用Spring/Hibernate,將非常感謝一個JTDS例子的鏈接。

謝謝。

+0

你是否嘗試過在數據庫工具上發佈帶有「for update」後綴的選擇,然後嘗試從應用程序運行程序?在運行上述查詢之前,您可能還必須檢查工具中的隔離級別。 – r0ast3d

+0

我會盡力的。這可能是我已經獲得了我所需要的那種鎖,而無需進行任何更改。 – JustinKSU

+0

我認爲應該明確地告訴你發生了什麼,請更新你是否看到它沒有鎖定。 – r0ast3d

回答

4

SERIALIZABLE隔離級別允許其他事務讀取數據,但不能修改。所以你需要明確SELECT ... FOR UPDATE(在休眠:Query#setLockMode(LockMode.UPGRADE))。

+0

我會試一試。 – JustinKSU

+0

您可以在SQL Server中執行「FOR UPDATE」 – JustinKSU

+0

當然。 [Somebody](http://stackoverflow.com/questions/1483725)已經行使了。 –

2

使用Hibernate的顯式鎖定。有更多的信息here

但是,我認爲你必須再想一次 - 你真的需要悲觀鎖嗎?在大多數情況下,樂觀鎖定效果更好,而hibernate支持版本控制得很好。

+0

該表格用作序列。我相信我需要悲觀鎖定,以確保在我使用它並增加它之前,沒有其他進程使用該值。 – JustinKSU

+0

你需要無間隙序列嗎? – kan

+0

我懷疑這是一項要求。爲什麼? – JustinKSU