在進行SELECT操作時,通常接下來會進行UPADTE的操作,如果希望COMMIT前,所SELECT的數據不會被其他線程SELECT出來,則兩個線程都加FOR UPDATE/FOR UPDATE NOWAIT關鍵字,這樣數據庫就會鎖定這些記錄,加了FOR UPDATE的會進行等待,直到上一線程結束,加了FOR UPDATE NOWAIT的線程則直接拋出異常,這種機制稱為數據庫的鎖機制。
HIBERNATE中的實現:
LockMode.NONE :有緩存用緩存,沒緩存則從數據庫讀
LockMode.READ :直接從數據庫讀,不使用緩存數據
LockMode.WRITE :在insert update數據的時候,HIBERNATE內部使用的。
以上3種均為HIBERNATE級別的鎖,也就是緩存級別的鎖。
下面2種為數據庫級別的鎖:
LockMode.UPGRADE:相當于SQL語句select for update,被select的數據都被數據庫鎖住了,不能被其他事務修改。
LockMode. UPGRADE_NOWAIT :是ORACLE數據庫特有的select for update nowait