测试乐观锁悲观锁

本文通过具体示例演示了如何使用Hibernate实现悲观锁和乐观锁,并深入探讨了这两种锁机制在并发场景下对数据库的影响。
[color=blue][size=large]这是DAO里的一些方法, package dao;

import java.util.List;

import po.*;

import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class TestDAO {

public void Test1() {
HibernateTools tools = new HibernateTools();
Session session = tools.getSession();
Transaction tra = session.beginTransaction();
tra.begin();
View1 view = (View1) session.get(View1.class, new Long(1));
try {
Thread.sleep(20000);
} catch (InterruptedException e) {

e.printStackTrace();
}
view.setName("xxxxxxxxxaaa");

session.update(view);
tra.commit();
tools.close();
}

public void Test2() {
HibernateTools tools = new HibernateTools();
Session session = tools.getSession();
Transaction tra = session.beginTransaction();
tra.begin();
View1 view = (View1) session.get(View1.class, new Long(1));
view.setName("xxxxxxxxxaaaaaaa");
session.update(view);
tra.commit();
tools.close();
}

public void Test3() {
HibernateTools tools = new HibernateTools();
Session session = tools.getSession();
Transaction tra = session.beginTransaction();
tra.begin();
View1 view = (View1) session.get(View1.class, new Long(1),
LockMode.UPGRADE);
try {
Thread.sleep(20000);
} catch (InterruptedException e) {

e.printStackTrace();
}
view.setName("xxxxxxxxx");
session.update(view);
tra.commit();
tools.close();
}

public void Test4() {
HibernateTools tools = new HibernateTools();
Session session = tools.getSession();
Transaction tra = session.beginTransaction();
tra.begin();
Query query = session
.createQuery("update view1 set name ='张三丰' where id =1");
query.setLockMode("p", LockMode.UPGRADE);
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tra.commit();
tools.close();
}

public void Test5() {
HibernateTools tools = new HibernateTools();
Session session = tools.getSession();
Transaction tra = session.beginTransaction();
tra.begin();
Query query = session.createQuery("from view1 where id =1");
query.setLockMode("p", LockMode.UPGRADE);

List list = query.list();
for (int i = 0; i < list.size(); i++) {
View1 v = (View1) list.get(i);
System.out.println(v.getName());
}

tra.commit();
tools.close();
}
public void Test6() {
HibernateTools tools = new HibernateTools();
Session session = tools.getSession();
Transaction tra = session.beginTransaction();
tra.begin();
Query query = session.createQuery("insert into view1(name) values('王五')");
query.setLockMode("p", LockMode.UPGRADE);
List list = query.list();
for (int i = 0; i < list.size(); i++) {
View1 v = (View1) list.get(i);
System.out.println(v.getName());
}
tra.commit();
tools.close();
}
}
]这是一个工具类:


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateTools {
static SessionFactory sf = null;

static Session session = null;

public SessionFactory getSF() {
if (sf == null) {
Configuration cfg = new Configuration()
.configure();
sf = cfg.buildSessionFactory();
}
return sf;
}

public Session getSession() {
if (session == null) {
session = getSF().openSession();
}
return session;
}

public void close() {
if (session != null) {
session.close();
}
if (sf != null) {
sf.close();
}
}
}

[size=xx-large]这是几个Main方法来测试,[/size]import dao.TestDAO;



public class Test1 {

public static void main(String[] args) {
TestDAO dao = new TestDAO();
System.out.println("休息了20秒才去执行update方法");
dao.Test1();
}

}
..................等等都是类似的!
这样就可以仿真的测试到乐观锁与悲观锁在操作数据库时看到的深层次的东西了 [/size][/color[size=xx-large
提供的引用内容中未提及乐观锁悲观锁的压力测试结果。不过,从原理和常见场景来推测,乐观锁假设并发操作之间很少发生冲突,不主动使用锁保护共享资源,在更新时进行额外验证,基于数据版本或时间戳实现,适合读多的场景,不会阻塞读,开销较低;悲观锁认为并发操作冲突概率高,在操作前获取锁,事务结束释放,如行锁、表锁,开销较高,适用于写多读少的场景 [^1][^3][^4]。 在压力测试中,当读操作占比较大时,乐观锁通常会有更好的性能表现,因为其较低的开销不会对大量的读操作产生过多的阻碍;而在写操作频繁的情况下,悲观锁可能会因为能有效避免冲突,在数据一致性上表现更优,但可能因为锁的持有时间长而导致整体吞吐量下降。 以下是一个简单的伪代码示例,模拟乐观锁悲观锁的实现: ```python # 乐观锁示例 class OptimisticLock: def __init__(self, data, version=0): self.data = data self.version = version def update(self, new_data): # 模拟更新时检查版本号 # 假设这里获取到最新的版本号 current_version = self.version # 模拟更新操作 # ... # 检查版本号是否一致 if current_version == self.version: self.data = new_data self.version += 1 return True else: return False # 悲观锁示例 class PessimisticLock: def __init__(self, data): self.data = data self.locked = False def acquire_lock(self): if not self.locked: self.locked = True return True return False def release_lock(self): self.locked = False def update(self, new_data): if self.acquire_lock(): try: self.data = new_data return True finally: self.release_lock() return False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值