博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
悲观锁、乐观锁
阅读量:4569 次
发布时间:2019-06-08

本文共 826 字,大约阅读时间需要 2 分钟。

 一、Hibernate完成一个事务的过程

  

 

背景:

当多个事务同时要同一个数据时,如果没有良好的控制手段,则有可能同一个数据被别的事务修改而造成混乱,此时,可以利用数据库底层提供的锁机制对当前操作的数据进行锁定,以防止其他事务同时操作事务。

二、悲观锁(Pessimistic Locking)

  每次在操作数据时,总是悲观的认为会有别的事务也会操作同一数据,因此锁住该数据,直到自己操作完成后在解除锁。

  优点:安全         缺点:性能稍差

  可以使用Query或Criteria的setLockMode()方法来设定。

  LockMode.UPGRADE:利用数据库的for update子句实现锁定

  LockMode.UPGRADE_NOWWAIT:使用for update nowait子句进行锁定,oracle使用。

悲观锁使用:

  使用Query类下的setLockMode()方法,第一个参数表示数据库名,第二个参数LockMode.UPGRADE_NOWWAIT表示强力锁止,表示任何时候只与允许一个线程操作

 

三、乐观锁(Optimistic Locking)

  相对于悲观锁而言,它通常认为多个事务同时操作同一个数据的情况是很少的,因而不做数据库层次上的锁定,只是基于数据版本表示,实现应用程序级别上的锁定机制。

  优点:性能稍差         缺点:安全

乐观锁使用:  

  为数据增加一个版本标识,一般是通过数据库表增加一个version字段来实现的。当读取数据时,版本号自动加一。在提交数据时将现有版本号与数据库表对应记录的版本号进行比对,如果提交的数据版本号大于数据库表中的版本号,则允许更新数据,否则禁止更新数据。

  之后在po下的加乐观锁的那个类的对应version属性上加上@version注解

  

 

转载于:https://www.cnblogs.com/television/p/8683233.html

你可能感兴趣的文章
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>
[c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
查看>>
[转载,感觉写的非常详细]DUBBO配置方式详解
查看>>
linux Valgrind使用说明-内存泄漏
查看>>
Android在Eclipse上的环境配置
查看>>
面向对象(五)
查看>>
android平台下使用点九PNG技术
查看>>
Python学习3,列表
查看>>
最长回文子串
查看>>
JAVA基础-JDBC(一)
查看>>
js中for和while运行速度比较
查看>>
算法第5章作业
查看>>
7.9 练习
查看>>
基于ArcGIS JS API的在线专题地图实现
查看>>
learnByWork
查看>>
lua 函数
查看>>
Git的基本命令
查看>>
四平方和
查看>>