共享鎖 S鎖 排他鎖 X鎖

2021-07-22 21:56:08 字數 1939 閱讀 7126

共享鎖【s鎖】

又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。

排他鎖【x鎖】

又稱寫鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其他事務不能再對a加任何鎖,直到t釋放a上的鎖。這保證了其他事務在t釋放a上的鎖之前不能再讀取和修改a。

jpa 2.0提供的程式鎖

鎖是處理資料庫事務併發的一種技術,當兩個或更多資料庫事務併發地訪問相同資料時,鎖可以保證同一時間只有乙個事務可以修改資料。

鎖的方法通常有兩種:樂觀鎖和悲觀鎖。樂觀鎖認為多個併發事務之間很少出現衝突,也就是說不會經常出現同一時間讀取或修改相同資料,在樂觀鎖中,其目標是讓併發事務自由地同時得到處理,而不是發現或預防衝突。兩個事務在同一時刻可以訪問相同的資料,但為了預防衝突,需要對資料執行一次檢查,檢查自上次讀取資料以來發生的任何變化。

悲觀鎖認為事務會經常發生衝突,在悲觀鎖中,讀取資料的事務會鎖定資料,在前面的事務提交之前,其它事務都不能修改資料。

jpa 1.0只支援樂觀鎖,你可以使用entitymanager類的lock()方法指定鎖模式的值,可以是read或write,如:

entitymanagerem = ... ;

em.lock (p1, read);

對於read鎖模式,jpa實體管理器在事務提交前都會鎖定實體,檢查實體的版本屬性確定實體自上次被讀取以來是否有更新,如果版本屬性被更新了,實體管理器會丟擲乙個optimisticlockexception異常,並回滾事務。

對於write鎖模式,實體管理器執行和read鎖模式相同的樂觀鎖操作,但它也會更新實體的版本列。

jpa 2.0增加了6種新的鎖模式,其中兩個是樂觀鎖。jpa 2.0也允許悲觀鎖,並增加了3種悲觀鎖,第6種鎖模式是無鎖。

下面是新增的兩個樂觀鎖模式:

2、optimistic_force_increment:它和write鎖模式相同,jpa 2.0仍然支援write鎖模式,但明確指出在新應用程式中推薦使用optimistic_force_increment。

下面是新增的三個悲觀鎖模式:

1、pessimistic_read:只要事務讀實體,實體管理器就鎖定實體,直到事務完成鎖才會解開,當你想使用重複讀語義查詢資料時使用這種鎖模式,換句話說就是,當你想確保資料在連續讀期間不被修改,這種鎖模式不會阻礙其它事務讀取資料。

2、pessimistic_write:只要事務更新實體,實體管理器就會鎖定實體,這種鎖模式強制嘗試修改實體資料的事務序列化,當多個併發更新事務出現更新失敗機率較高時使用這種鎖模式。

3、pessimistic_force_increment:當事務讀實體時,實體管理器就鎖定實體,當事務結束時會增加實體的版本屬性,即使實體沒有修改。

你也可以指定新的鎖模式none,在這種情況下表示沒有鎖發生。

jpa 2.0也提供了多種方法為實體指定鎖模式,你可以使用entitymanager的lock() 和 find()方法指定鎖模式。此外,entitymanager.refresh()方法可以恢復實體例項的狀態。

下面的**顯示了使用pessimistic_write鎖模式的悲觀鎖:

// read

part p = em.find(part.class, pid);

// lock and refresh before update

em.refresh(p, pessimistic_write);

int pamount = p.getamount();

p.setamount(pamount - ucount); 

在這個例子中,它首先讀取一些資料,然後應用pessimistic_write鎖,在更新資料之前呼叫entitymanager.refresh()方法,當事務更新實體時,pessimistic_write鎖鎖定實體,其它事務就不能更新相同的實體,直到前面的事務提交。

共享鎖與排他鎖

共享鎖 s鎖 如果事務t對資料a加上共享鎖後,則其他事務只能對a再加共享鎖,不能加排他鎖。獲准共享鎖的事務職能讀取資料,不能修改資料。排他鎖 x鎖 如果事務t對資料a加上排他鎖後,則其他事務不能在對a加任何型別的封鎖。獲准排他鎖的事務既能讀取資料,也能修改資料。資料庫死鎖的原因 若干事務相互等待對方...

Mysql共享鎖 排他鎖

我之前專程寫了mysql中myisam和innodb區別 和mysql儲存引擎 這裡主要寫一些影響鎖相關的內容 mysql 在5.5之前預設使用 myisam 儲存引擎,之後使用 innodb 檢視當前儲存引擎 show variables like storage engine myisam 運算...

共享鎖 S鎖 和排它鎖 X鎖

共享鎖 讀取 操作建立的鎖。其他使用者可以併發讀取資料,但任何事物都不能獲取資料上的排它鎖,直到已釋放所有共享鎖。共享鎖 s鎖 又稱為讀鎖,若事務t對資料物件a加上s鎖,則事務t只能讀a 其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這就保證了其他事務可以讀a,但在t釋放a上的s鎖之...