Hibernate事务隔离机制(乐观锁-悲观锁)(二)

2015-01-21 11:21:11 · 作者: · 浏览: 23
essionFactory();

}

@AfterClass

public static void afterClass() {

sf.close();

}

?

@Test

public void testSchemaExport() {

new SchemaExport(new Configuration().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进行操作,将会导致banlance取值被此session覆盖

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 caculations

balance = balance - 10;

a.setBalance(balance);

session.getTransaction().commit();

session.close();

}

public static void main(String[] args) {

beforeClass();

}

}

(4)测试testPessimisticlock()方法,观察产生的SQL语句如下:

Hibernate:

select

account0_.id as id1_0_0_,

account0_.balance as balance2_0_0_

from

Account account0_

where

account0_.id=? for update

?

Hibernate:

update

Account

set

balance=?

where

id=?

?

?

?

乐观锁:

实验:

(1)修改Account.java

package com.zgy.hibernate.model;

?

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;

}

?

?

}

?

?

(2)测试:

package com.zgy.hibernate.model;

?

?

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

?

?

public class HibernateLockTest {

private static SessionFactory sf;

?

@BeforeClass

public static void beforeClass() {

sf = HibernateUtil.getSessionFactory();

}

@AfterClass

public static void afterClass() {

sf.close();

}

?

@Test

public void testSchemaExport() {

new SchemaExport(new Configuration().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.setBala