最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

2.read-committed:不會出現(xiàn)臟讀,因為只有另一個事務(wù)提交才會讀取來結(jié)果,但仍然會出現(xiàn)不可重復(fù)讀和幻讀現(xiàn)象。

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

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

hibernate的隔離機制

i.hibernate.connection.isolation=2

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

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

b)LockMode.read 在查詢的時候 hibernate會自動獲取鎖

c)LockMode.write insert update hibernate會自動獲取鎖

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; 
//在保存時很有可能會把在同一時期修改的給覆蓋掉 
//這個時候上一把"鎖"就可以避免這個問題 
a.setBalance(balance); 
session.getTransaction().commit(); 
session.close(); 
} 
//下面這個就是對上面那個例子做的修改 
@Test 
public void testPessimisticLock() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
//給它加把鎖,加鎖的機制上面已經(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ù)庫一個指令,要求數(shù)據(jù)庫幫忙加鎖。
——————————————————————————————————————

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

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

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

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

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

樂觀鎖的實現(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//加了這個注解就說明這個是專門用來做版本標(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); 
//第一個session一旦提交,version就會+1 
session.getTransaction().commit(); 
System.out.println(a1.getVersion()); 
//第二個session提交的時候,一看version不一樣就會報錯 
//出了錯誤做個記錄,下次再提交(也可以用其他方法) 
        session2.getTransaction().commit(); 
System.out.println(a2.getVersion()); 
session.close(); 
session2.close(); 
} 

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

總結(jié)

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

相關(guān)文章

  • Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)

    Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)

    本文主要介紹了Java redis存Map<String,RedisCustom>對象類型數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • SpringBoot集成Lettuce客戶端操作Redis的實現(xiàn)

    SpringBoot集成Lettuce客戶端操作Redis的實現(xiàn)

    本文主要介紹了SpringBoot集成Lettuce客戶端操作Redis的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • springboot運行jar生成的日志到指定文件進行管理方式

    springboot運行jar生成的日志到指定文件進行管理方式

    這篇文章主要介紹了springboot運行jar生成的日志到指定文件進行管理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java中isAssignableFrom的用法詳解

    Java中isAssignableFrom的用法詳解

    下面小編就為大家?guī)硪黄狫ava中isAssignableFrom的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 基于HttpServletRequest 相關(guān)常用方法的應(yīng)用

    基于HttpServletRequest 相關(guān)常用方法的應(yīng)用

    本篇文章小編為大家介紹,基于HttpServletRequest 相關(guān)常用方法的應(yīng)用,需要的朋友參考下
    2013-04-04
  • mybatis雙重foreach如何實現(xiàn)遍歷map中的兩個list數(shù)組

    mybatis雙重foreach如何實現(xiàn)遍歷map中的兩個list數(shù)組

    本文介紹了如何解析前端傳遞的JSON字符串并在Java后臺動態(tài)構(gòu)建SQL查詢條件,首先,通過JSONArray.fromObject()將JSON字符串轉(zhuǎn)化為JSONArray對象,遍歷JSONArray,從中提取name和infos,構(gòu)建成Map對象用于Mybatis SQL映射
    2024-09-09
  • 一文帶你學(xué)會規(guī)則引擎Drools的應(yīng)用

    一文帶你學(xué)會規(guī)則引擎Drools的應(yīng)用

    Drools?就是一個開源的業(yè)務(wù)規(guī)則引擎,可以很容易地與?spring?boot?應(yīng)用程序集成,這篇文章就來和大家詳細聊聊Drools的具體應(yīng)用,需要的可以參考一下
    2023-03-03
  • Java實現(xiàn)中序表達式的實例代碼

    Java實現(xiàn)中序表達式的實例代碼

    這篇文章主要介紹了Java實現(xiàn)中序表達式的實例代碼,需要的朋友可以參考下
    2018-08-08
  • Spring boot基于JPA訪問MySQL數(shù)據(jù)庫的實現(xiàn)

    Spring boot基于JPA訪問MySQL數(shù)據(jù)庫的實現(xiàn)

    本文主要介紹了Spring boot基于JPA訪問MySQL數(shù)據(jù)庫的實現(xiàn),Spring boot結(jié)合Jpa 能夠簡化創(chuàng)建 JPA 數(shù)據(jù)訪問層和跨存儲的持久層功能,用戶的持久層Dao接口只需要繼承定義好的接口,感興趣的可以了解一下
    2021-06-06
  • JavaWeb?中的?Filter組件詳解

    JavaWeb?中的?Filter組件詳解

    本文詳細介紹了JavaWeb中的Filter組件,包括其基本概念、工作原理、核心接口和類、配置方式以及常見應(yīng)用示例,Filter可以實現(xiàn)請求預(yù)處理、響應(yīng)后處理、鏈?zhǔn)教幚淼裙δ?通過配置文件或注解進行設(shè)置,適用于字符編碼、身份認(rèn)證、日志記錄等多種場景,感興趣的朋友一起學(xué)習(xí)吧
    2025-11-11

最新評論

兰考县| 泰和县| 防城港市| 峨眉山市| 镇巴县| 石门县| 社会| 黄山市| 庆云县| 舞阳县| 枝江市| 石首市| 蒙阴县| 九台市| 余姚市| 唐山市| 广西| 河西区| 白朗县| 循化| 张家口市| 屯门区| 江北区| 梁山县| 通河县| 孝义市| 类乌齐县| 尼木县| 华安县| 昌乐县| 孟村| 普格县| 亳州市| 兴海县| 宜丰县| 鲁甸县| 剑河县| 饶阳县| 南澳县| 香格里拉县| 郁南县|