全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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:

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中配置:

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

测试:

@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:

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

测试:

 @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有所帮助。有什么问题可以随时留言,小编会及时回复大家。感谢大家对本站的支持。


# hibernate  # 悲观锁  # 乐观锁  # 乐观锁与悲观锁的实现  # 悲观锁和乐观锁  # java高并发锁的3种实现示例代码  # Java中数据库常用的两把锁之乐观锁和悲观锁  # JPA使用乐观锁应对高并发方式  # 就会  # 加锁  # 这个时候  # 给它  # 出了  # 这是  # 有什么  # 是在  # 第一个  # 就不  # 才会  # 就好  # 可以用  # 这个问题  # 依赖于  # 不去  # 这条  # 我用  # 第二个  # 这不是 


相关文章: 如何选择适配移动端的WAP自助建站平台?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  代刷网站制作软件,别人代刷火车票靠谱吗?  如何在IIS7上新建站点并设置安全权限?  如何在阿里云通过域名搭建网站?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何快速搭建二级域名独立网站?  如何用花生壳三步快速搭建专属网站?  网站制作模板下载什么软件,ppt模板免费下载网站?  微信小程序 input输入框控件详解及实例(多种示例)  如何挑选高效建站主机与优质域名?  家庭服务器如何搭建个人网站?  如何彻底删除建站之星生成的Banner?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何通过老薛主机一键快速建站?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何在云服务器上快速搭建个人网站?  设计网站制作公司有哪些,制作网页教程?  建站之星安装后如何自定义网站颜色与字体?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  建站之星如何修改网站生成路径?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  为什么Go需要go mod文件_Go go mod文件作用说明  公司网站制作需要多少钱,找人做公司网站需要多少钱?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  建站上市公司网站建设方案与SEO优化服务定制指南  网站制作公司排行榜,四大门户网站排名?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站之星如何配置系统实现高效建站?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  中山网站制作网页,中山新生登记系统登记流程?  建站之星后台密码如何安全设置与找回?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何选择高效可靠的多用户建站源码资源?  宿州网站制作公司兴策,安徽省低保查询网站?  建站VPS选购需注意哪些关键参数?  如何快速生成高效建站系统源代码?  建站之星如何保障用户数据免受黑客入侵?  如何快速搭建高效服务器建站系统?  如何获取免费开源的自助建站系统源码?  定制建站流程步骤详解:一站式方案设计与开发指南  建站之星CMS五站合一模板配置与SEO优化指南  湖北网站制作公司有哪些,湖北清能集团官网?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  如何快速搭建高效WAP手机网站吸引移动用户?  C#如何序列化对象为XML XmlSerializer用法  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  佛山企业网站制作公司有哪些,沟通100网上服务官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。