日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate 悲观锁乐观锁

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate 悲观锁乐观锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

悲觀鎖和樂觀鎖是:在事務隔離機制中設置了ReadCommited的情況下,兩種可以避免不可重復讀的方式。

?

設置成讀已提交是考慮到安全和處理速度,保證并發效率,但是在這個情況下仍然需要避免不可重復讀這種情況,于是hibernate提供兩種鎖來解決這個問題。

?

?

?

悲觀鎖:自己事務完成之前別人不能動數據。依賴于數據庫,“for update”

?

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;
??? }
}

?

測試類:

package com.bjsxt.hibernate;

import java.math.BigDecimal;

import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateCacheTest {
??? private static SessionFactory sf;
???
??? @BeforeClass
??? public static void beforeClass() {
??????? sf = new AnnotationConfiguration().configure().buildSessionFactory();
??? }
??? @AfterClass
??? public static void afterClass() {
??????? sf.close();
??? }
???
??? @Test
??? public void testSchemaExport() {
??????? new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
??? }
???
??? @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);//NOWAIT ORACL支持
??????? int balance = a.getBalance();
??????? //do some caculation
??????? balance = balance - 10;
??????? a.setBalance(balance);
??????? session.getTransaction().commit();
??????? session.close();
??? }
???
??? public static void main(String[] args) {
??????? beforeClass();
??? }
}

?

樂觀鎖:依賴于表的一個字段,該字段每當該條數據被更新了,字段的內容就會變化而且不會和以前重復。將model中加上@Version即可標記該字段。

?

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;
??? }
}

測試類:

package com.bjsxt.hibernate;

import java.math.BigDecimal;

import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateCacheTest {
??? private static SessionFactory sf;

??? @BeforeClass
??? public static void beforeClass() {
??????? sf = new AnnotationConfiguration().configure().buildSessionFactory();
??? }

??? @AfterClass
??? public static void afterClass() {
??????? sf.close();
??? }

??? @Test
??? public void testSchemaExport() {
??????? new SchemaExport(new AnnotationConfiguration().configure()).create(
??????????????? false, true);
??? }

??? @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.getTransaction().commit();
??????? System.out.println(a1.getVersion());

??????? session2.getTransaction().commit();
??????? System.out.println(a2.getVersion());

??????? session.close();
??????? session2.close();

??? }

??? public static void main(String[] args) {
??????? beforeClass();
??? }
}

轉載于:https://www.cnblogs.com/flying607/p/3484241.html

總結

以上是生活随笔為你收集整理的hibernate 悲观锁乐观锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。