亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

悲觀鎖與樂觀鎖怎么利用Hibernate實現

發布時間:2020-12-05 16:57:42 來源:億速云 閱讀:203 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關悲觀鎖與樂觀鎖怎么利用Hibernate實現,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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

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

2.read-committed:不會出現臟讀,因為只有另一個事務提交才會讀取來結果,但仍然會出現不可重復讀和幻讀現象。

4.repeatable read: MySQL 默認。可重復讀,讀數據讀出來之后給它加把鎖,其他人先別更新,等我用完了你再更新。你的事務沒完,其他事務就不可能改這條記錄。

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

hibernate的隔離機制

i.hibernate.connection.isolation=2

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

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

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

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

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

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(); 
//給它加把鎖,加鎖的機制上面已經提到了 
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(); 
} 

這是依賴于數據庫的鎖的,也就是給數據庫一個指令,要求數據庫幫忙加鎖。
——————————————————————————————————————

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

這不是依賴數據庫加鎖的,是在程序中加鎖的。

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

那么這種機制是如何產生隔離能力的呢?

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

樂觀鎖的實現:(@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//加了這個注解就說明這個是專門用來做版本標注的 
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(); 
} 

關于悲觀鎖與樂觀鎖怎么利用Hibernate實現就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邹城市| 会宁县| 砚山县| 双城市| 湘西| 鹤山市| 垦利县| SHOW| 淄博市| 白城市| 定襄县| 重庆市| 固始县| 镇沅| 义马市| 宜兰市| 无棣县| 江油市| 靖州| 保亭| 都昌县| 曲靖市| 邻水| 马山县| 榕江县| 乐山市| 康定县| 富源县| 鄄城县| 丰城市| 凤城市| 阿荣旗| 漾濞| 凤山县| 宜阳县| 滁州市| 兴和县| 平昌县| 黎城县| 仲巴县| 铁力市|