欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖代碼介紹

 更新時(shí)間:2017年09月27日 16:30:54   作者:光仔December  
這篇文章主要介紹了Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖的有關(guān)內(nèi)容,涉及hibernate的隔離機(jī)制,以及實(shí)現(xiàn)悲觀鎖和樂觀鎖的代碼實(shí)現(xiàn),需要的朋友可以了解下。

四種隔離機(jī)制不要忘記:(1,2,4,8)

1.read-uncommitted:能夠去讀那些沒有提交的數(shù)據(jù)(允許臟讀的存在)

2.read-committed:不會(huì)出現(xiàn)臟讀,因?yàn)橹挥辛硪粋€(gè)事務(wù)提交才會(huì)讀取來結(jié)果,但仍然會(huì)出現(xiàn)不可重復(fù)讀和幻讀現(xiàn)象。

4.repeatable read: MySQL 默認(rèn)??芍貜?fù)讀,讀數(shù)據(jù)讀出來之后給它加把鎖,其他人先別更新,等我用完了你再更新。你的事務(wù)沒完,其他事務(wù)就不可能改這條記錄。

8.serializable:序列化,最高級(jí)別。一個(gè)一個(gè)來,不去并發(fā)。效率最低。

hibernate的隔離機(jī)制

i.hibernate.connection.isolation=2

ii.用悲觀鎖解決:repeatable read的問題(依賴于數(shù)據(jù)庫的鎖)

a)LockMode.None 無鎖的機(jī)制,Transaction結(jié)束時(shí),切換到此模式

b)LockMode.read 在查詢的時(shí)候 hibernate會(huì)自動(dòng)獲取鎖

c)LockMode.write insert update hibernate會(huì)自動(dòng)獲取鎖

d)以上3中鎖的模式,是hibernate內(nèi)部使用的

e)LockMode.UPGRADE_NOWAIT ORACLE支持的鎖的方式

例子:

Account.java:

package com.bjsxt.hibernate; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
@Entity 
public class Account { 
private int id; 
private int balance; //BigDecimal 
@Id 
@GeneratedValue 
public int getId() { 
return id; 
} 
public void setId(int id) { 
this.id = id; 
} 
public int getBalance() { 
return balance; 
} 
public void setBalance(int balance) { 
this.balance = balance; 
} 
} 

hibernate.cfg.xml中配置:

<mapping class="com.bjsxt.hibernate.Account"/> 

測試:

@Test 
public void testSave() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
Account a = new Account(); 
a.setBalance(100); 
session.save(a); 
session.getTransaction().commit(); 
session.close(); 
} 
@Test 
public void testOperation1() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
Account a = (Account)session.load(Account.class, 1); 
int balance = a.getBalance(); 
//do some caculations 
balance = balance - 10; 
//在保存時(shí)很有可能會(huì)把在同一時(shí)期修改的給覆蓋掉 
//這個(gè)時(shí)候上一把"鎖"就可以避免這個(gè)問題 
a.setBalance(balance); 
session.getTransaction().commit(); 
session.close(); 
} 
//下面這個(gè)就是對(duì)上面那個(gè)例子做的修改 
@Test 
public void testPessimisticLock() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
//給它加把鎖,加鎖的機(jī)制上面已經(jīng)提到了 
Account a = (Account)session.load(Account.class, 1, LockMode.UPGRADE); 
int balance = a.getBalance(); 
//do some caculation 
balance = balance - 10; 
a.setBalance(balance); 
session.getTransaction().commit(); 
session.close(); 
} 

這是依賴于數(shù)據(jù)庫的鎖的,也就是給數(shù)據(jù)庫一個(gè)指令,要求數(shù)據(jù)庫幫忙加鎖。
——————————————————————————————————————

iii.Hibernate(JPA)樂觀鎖定(ReadCommitted)

這不是依賴數(shù)據(jù)庫加鎖的,是在程序中加鎖的。

舉個(gè)例子:一個(gè)數(shù)據(jù)需要隔離機(jī)制(不能重復(fù)讀),這個(gè)時(shí)候在更新的字段上加"版本號(hào)"(version字段),一旦有人給它update一下,這個(gè)值就加1(version+1)。

那么這種機(jī)制是如何產(chǎn)生隔離能力的呢?

原因是事務(wù)A讀取字段的同時(shí),事務(wù)B緊接著也讀取這個(gè)字段,而且改了它,此時(shí)version變成1了。這個(gè)時(shí)候事務(wù)A就會(huì)檢查字段是否被改變了,如果被改變它也做相應(yīng)的改變,沒有改變就不改。

樂觀鎖的實(shí)現(xiàn):(@Version)

Account.java:

package com.bjsxt.hibernate;  
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Version;  
@Entity 
public class Account { 
private int id; 
private int balance; 
private int version;  
@Version//加了這個(gè)注解就說明這個(gè)是專門用來做版本標(biāo)注的 
public int getVersion() { 
return version; 
} 
public void setVersion(int version) { 
this.version = version; 
} 
@Id 
@GeneratedValue 
public int getId() { 
return id; 
} 
public void setId(int id) { 
this.id = id; 
} 
public int getBalance() { 
return balance; 
} 
public void setBalance(int balance) { 
this.balance = balance; 
} 
} 

測試:

 @Test 
public void testSave() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
Account a = new Account(); 
a.setBalance(100); 
session.save(a); 
session.getTransaction().commit(); 
session.close(); 
} 
@Test 
public void testOptimisticLock() { 
Session session = sf.openSession(); 
Session session2 = sf.openSession(); 
session.beginTransaction(); 
Account a1 = (Account) session.load(Account.class, 1); 
session2.beginTransaction(); 
Account a2 = (Account) session2.load(Account.class, 1); 
a1.setBalance(900); 
a2.setBalance(1100); 
//第一個(gè)session一旦提交,version就會(huì)+1 
session.getTransaction().commit(); 
System.out.println(a1.getVersion()); 
//第二個(gè)session提交的時(shí)候,一看version不一樣就會(huì)報(bào)錯(cuò) 
//出了錯(cuò)誤做個(gè)記錄,下次再提交(也可以用其他方法) 
        session2.getTransaction().commit(); 
System.out.println(a2.getVersion()); 
session.close(); 
session2.close(); 
} 

悲觀樂觀的區(qū)別:悲觀鎖認(rèn)為一定會(huì)受到影響,我加鎖誰也別想動(dòng)。
樂觀鎖,沒出事就好,出了事我再想辦法解決。

總結(jié)

以上就是本文關(guān)于Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖代碼介紹的全部內(nèi)容,希望對(duì)大家學(xué)習(xí)hibernate有所幫助。有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家。感謝大家對(duì)本站的支持。

相關(guān)文章

  • Lambda表達(dá)式下訪問外部變量問題

    Lambda表達(dá)式下訪問外部變量問題

    這篇文章主要介紹了Lambda表達(dá)式下訪問外部變量問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程

    Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程

    這篇文章主要介紹了Spring Boot 開發(fā)環(huán)境熱部署,本文給大家介紹了Spring Boot 開發(fā)環(huán)境熱部署的原理及快速配置方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java 提取照片的EXIF信息批量重命名

    Java 提取照片的EXIF信息批量重命名

    這篇文章主要介紹了Java 提取照片的EXIF信息批量重命名的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • nacos中的配置使用@Value注解獲取不到值的原因及解決方案

    nacos中的配置使用@Value注解獲取不到值的原因及解決方案

    這篇文章主要介紹了nacos中的配置使用@Value注解獲取不到值的原因分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • OpenJDK源碼調(diào)試圖文教程

    OpenJDK源碼調(diào)試圖文教程

    這篇文章主要介紹了OpenJDK源碼調(diào)試,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java中json格式化BigDecimal保留2位小數(shù)

    Java中json格式化BigDecimal保留2位小數(shù)

    這篇文章主要給大家介紹了關(guān)于Java中json格式化BigDecimal保留2位小數(shù)的相關(guān)資料,BigDecimal是Java中的一個(gè)數(shù)學(xué)庫,可以實(shí)現(xiàn)高精度計(jì)算,文中給出了詳細(xì)的代碼實(shí)例,需要的朋友可以參考下
    2023-09-09
  • 啟動(dòng)SpringBoot報(bào)JavaMail加載錯(cuò)誤的原因分析和解決

    啟動(dòng)SpringBoot報(bào)JavaMail加載錯(cuò)誤的原因分析和解決

    這篇文章給大家介紹了啟動(dòng)SpringBoot報(bào)JavaMail加載錯(cuò)誤的原因分析和解決,文中通過代碼示例給出了詳細(xì)的原因分析和解決方法,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • java 快速實(shí)現(xiàn)異步調(diào)用的操作方法

    java 快速實(shí)現(xiàn)異步調(diào)用的操作方法

    這篇文章主要介紹了java 如何快速實(shí)現(xiàn)異步調(diào)用方法,今天我們就來了解下 CompletableFuture,它Java 8引入的一種功能強(qiáng)大的異步編程工具,可以用于實(shí)現(xiàn)復(fù)雜的異步操作和處理鏈?zhǔn)降漠惒饺蝿?wù),需要的朋友可以參考下
    2023-07-07
  • springboot應(yīng)用訪問zookeeper的流程

    springboot應(yīng)用訪問zookeeper的流程

    這篇文章主要介紹了springboot應(yīng)用訪問zookeeper的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring Boot使用Log4j2的實(shí)例代碼

    Spring Boot使用Log4j2的實(shí)例代碼

    這篇文章主要介紹了Spring Boot使用Log4j2的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07

最新評(píng)論