hibernate 悲观锁乐观锁
悲觀鎖和樂(lè)觀鎖是:在事務(wù)隔離機(jī)制中設(shè)置了ReadCommited的情況下,兩種可以避免不可重復(fù)讀的方式。
?
設(shè)置成讀已提交是考慮到安全和處理速度,保證并發(fā)效率,但是在這個(gè)情況下仍然需要避免不可重復(fù)讀這種情況,于是hibernate提供兩種鎖來(lái)解決這個(gè)問(wèn)題。
?
?
?
悲觀鎖:自己事務(wù)完成之前別人不能動(dòng)數(shù)據(jù)。依賴于數(shù)據(jù)庫(kù),“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;
??? }
}
?
測(cè)試類:
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();
??? }
}
?
樂(lè)觀鎖:依賴于表的一個(gè)字段,該字段每當(dāng)該條數(shù)據(jù)被更新了,字段的內(nèi)容就會(huì)變化而且不會(huì)和以前重復(fù)。將model中加上@Version即可標(biāo)記該字段。
?
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;
??? }
}
測(cè)試類:
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();
??? }
}
轉(zhuǎn)載于:https://www.cnblogs.com/flying607/p/3484241.html
總結(jié)
以上是生活随笔為你收集整理的hibernate 悲观锁乐观锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows版本git的下载地址
- 下一篇: 文本编辑器Nano实用快捷键