一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Hibernate實現悲觀鎖和樂觀鎖代碼介紹

Hibernate實現悲觀鎖和樂觀鎖代碼介紹

2021-01-11 14:35光仔December Java教程

這篇文章主要介紹了Hibernate實現悲觀鎖和樂觀鎖的有關內容,涉及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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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中配置:

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

測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
}
}

測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@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實現悲觀鎖和樂觀鎖代碼介紹的全部內容,希望對大家學習hibernate有所幫助。有什么問題可以隨時留言,小編會及時回復大家。感謝大家對本站的支持。

原文鏈接:http://blog.csdn.net/acmman/article/details/44176281

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 大好硬好深好爽想要视频 | 91在线老师啪国自产 | 久久久这里有精品999 | 人禽l交视频在线播放 视频 | 亚洲女同一区二区 | 洗濯屋し在线观看 | 国产一区二区三区久久精品 | 鄂州一家三口完整版免费 | 99视频有精品 | 美国玩尿眼道videos | 免费看隐私男生网站 | spank日本网站脱裤子打屁股 | 韩国女主播一区二区视频 | 鬼吹灯天星术在线高清观看 | 亚洲天堂在线视频播放 | 国产51社区精品视频资源 | vod国产成人精品视频 | 婷婷国产在线 | 激情综| 动漫女性扒开尿口羞羞漫画 | 国产日韩高清一区二区三区 | 国产精品美女久久久久 | 国产女主播在线播放一区二区 | 大jjjj免费看视频 | 奇米影视中文字幕 | 亚洲成av人片在线观看天堂无码 | 国产亚洲精品自在线亚洲情侣 | 色老板最新网站视频地址 | 美女大逼逼 | 成人黄页网站 | 精品小视频在线 | 香蕉久久一区二区三区啪啪 | beeg最新| 国产成人激情 | 99亚洲自拍 | 亚洲欧美日韩另类精品一区二区三区 | 久久99国产精品二区不卡 | np小说h | 亚洲高清视频在线观看 | 免费人成在线观看视频播放 | 美女的隐私无遮挡的网页 |