加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle数据库中加锁应该都是悲观锁是吗?

发布时间:2020-12-12 14:00:45 所属栏目:百科 来源:网络整理
导读:Oracle数据库中加锁应该都是悲观锁是吗? [问题点数:40分,结帖人chenchendf] 不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主 收藏 一天十小时 结帖率:98.39% 我的理解是在数据库中加的锁都是悲观锁,如select..forupdate,insert等。
一天十小时
结帖率:98.39% 我的理解是在数据库中加的锁都是悲观锁,如select..forupdate,insert等。

数据库中可以加乐观锁吗?如有,能否举个例子?

基本的锁类型有两种:排它锁(Exclusivelocks记为X锁)和共享锁(Sharelocks记为S锁)。排它锁应该是悲观锁,共享锁是属于悲观还是乐观锁?

交叉概念有点晕,以前知道的悲观锁和乐观锁是在hibernate中的,但在百度搜索的时候看到很多oracle的悲观锁与乐观锁。

请求高手,莫见笑啊~~
  • redis的 悲观锁和乐观锁的区别
发表于: 2011-09-01 15:31:59楼主 对我有用[0]| 丢个板砖[0]| 引用| 举报| 管理回复次数:15 CSDN推荐
  • Oracle数据库默认使用的是乐观锁还是悲观锁?
  • Mybatis读写锁bug
  • 事务隔离级别与乐观锁、悲观锁
  • hibernate中的悲观锁_乐观锁解决事物并发的问题
  • JPA 2.0 锁机制
  • 悲观锁、乐观锁、行级锁、表级锁
  • 随便写点:关于java操作数据库和oracle锁。。。
  • 悲观锁解决高并发访问问题
兰兰
Oracle中,我不知道悲观锁和乐观锁,不经常这么叫的吧?
只知道你说的排它锁之类的。
  • 数据库中的悲观锁和乐观锁详解
回复于: 2011-09-01 16:22:59#1得分:4 引用| 管理 wuhuipengwhp
有悲观锁也有乐观锁的
  • 悲观锁和相比synchronized,ReentrantLock增加了一些高级功能,主要有以下3项:等待可 中断、可实现公平锁,以及锁可以绑定多个条件
回复于: 2011-09-01 16:37:47#2得分:2 引用| 管理 一天十小时
引用2楼wuhuipengwhp的回复:
有悲观锁也有乐观锁的
能否举个乐观锁的例子?在oracle数据库中的。
  • hibernate和mybatis中数据库锁的应用
回复于: 2011-09-01 17:40:55#3得分:0 引用| 管理
  • 【Redis学习】Redis分布式锁实现秒杀业务(乐观锁、悲观锁)
回复于: 2011-09-01 17:42:15#4得分:0 引用| 管理 youshang444
加悲观锁就不会有丢失更新的问题,但有可能会影响性能!
  • 数据库中的悲观锁和乐观锁和死锁
回复于: 2011-09-01 20:05:17#5得分:2 引用| 管理 wffffc
引用4楼chenchendf的回复:
引用2楼wuhuipengwhp的回复:
有悲观锁也有乐观锁的

能否举个乐观锁的例子?在oracle数据库中的。
SQL>desct
名称是否为空?类型
-------------------------------------------------------------------
INUMBER(38)

SQL>select*fromtwhererownum=1;

I
----------
258

SQL>updatetseti=255wherei=258;

已更新1行。

update语句里面加where条件,tom书里面说的大概就是这个意思。
  • MySQL InnoDB 悲观锁机制
回复于: 2011-09-01 21:27:06#6得分:5 引用| 管理 引用6楼wffffc的回复:
SQL>desct
名称是否为空?类型
-------------------------------------------------------------------
INUMBER(38)

SQL>select*fromtwhererownum=1;

I
----------
258

SQL>updatetseti=255wherei=258;

已更新1行。

update语句里面加where条件,tom书里面说的大概就是这个意思。
没看出哪里加了乐观锁啊?update语句加where条件就是乐观锁?
  • 数据库中悲观锁和乐观锁
回复于: 2011-09-02 08:57:20#7得分:0 引用| 管理 咖啡
孤陋寡闻了,还真没听过这种说法,我只知道共享锁和排他锁。
  • 事务 四大特性 mysql 悲观锁与乐观锁
回复于: 2011-09-02 09:17:39#8得分:2 引用| 管理 天梯
引用楼主chenchendf的回复:
我的理解是在数据库中加的锁都是悲观锁,如select..forupdate,insert等。

数据库中可以加乐观锁吗?如有,能否举个例子?

基本的锁类型有两种:排它锁(Exclusivelocks记为X锁)和共享锁(Sharelocks记为S锁)。排它锁应该是悲观锁,共享锁是属于悲观还是乐观锁?

交叉概念有点晕,以前知道的悲观锁和乐观锁是在hibernate中的,但在……
oracle有悲观锁也有乐观锁。悲观锁比较安全一些,可以防止丢失更新,但是就是互相等待,影响效率。
一般会用乐观锁,即开始操作时,乐观的认为数据不会被其他人更改,直到提交时才加锁检查。比如在操作的表上加一列,保存个时间戳,提交时检查是不是最新的。不过乐观锁失败的可能性比较大。
  • 为什么有了事务这东西,还需要乐观锁悲观锁?
回复于: 2011-09-02 09:27:05#9得分:5 引用| 管理 yuhck39
Exclusivelocks
  • Java 悲观锁和乐观锁的实现
回复于: 2011-09-02 23:06:38#10得分:2 引用| 管理 fanxiaohe123
乐观锁用白话一点说:先改,改了再说,要是别人修改过了我就不再改了,要改也得重新查再改
一般是表共享,行排他
最好是乐观锁,因为效率,但当C/S结构时,悲观的好。
(都是自己的个人看法)
  • 线程同步(2)——悲观锁和乐观锁
回复于: 2011-09-06 18:54:38#11得分:6 引用| 管理 引用11楼fanxiaohe123的回复:
乐观锁用白话一点说:先改,改了再说,要是别人修改过了我就不再改了,要改也得重新查再改
一般是表共享,行排他
最好是乐观锁,因为效率,但当C/S结构时,悲观的好。
(都是自己的个人看法)
在oracle数据库里,举个乐观锁的例子?
  • java 5多线程乐观锁CAS之于悲观锁synchronized
回复于: 2011-09-07 08:03:53#12得分:0 引用| 管理 胖胖_多多
乐观锁,大多是基于数据版本(Version)记录机制实现。
数据版本即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。
读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
对于上面修改用户帐户信息的例子而言,假设数据库中帐户信息表中有一个version字段,当前值为1;而当前帐户余额字段(balance)为$100。
1操作员A此时将其读出(version=1),并从其帐户余额中扣除$50($100-$50)。
2在操作员A操作的过程中,操作员B也读入此用户信息(version=1),并从其帐户余额中扣除$20($100-$20)。
3操作员A完成了修改工作,将数据版本号加一(version=2),连同帐户扣除后余额(balance=$50),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录version更新为2。
4操作员B完成了操作,也将版本号加一(version=2)试图向数据库提交数据(balance=$80),但此时比对数据库记录版本时发现,操作员B提交的数据版本号为2,数据库记录当前版本也为2,不满足“提交版本必须大于记录当前版本才能执行更新“的乐观锁策略,因此,操作员B的提交被驳回。
这样,就避免了操作员B用基于version=1的旧数据修改的结果覆盖操作员A的操作结果的可能。
乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。
  • SSH:Hibernate框架(悲观锁和乐观锁解决hibernate并发 )
回复于: 2011-09-07 09:17:40#13得分:6 引用| 管理 胖胖_多多
补充一下
在乐观锁中,常用的实现方法有3种。

[1]第一种就是在数据取得的时候把整个数据都copy到应用中,在进行提交的时候比对当前数据库中的数据和开始的时候更新前取得的数据。当发现两个数据一模一样以后,就表示没有冲突可以提交,否则则是并发冲突,需要去用业务逻辑进行解决。

[2]第二种乐观锁的做法就是采用版本戳,就是我上边说的那个[#13楼]
[3]第三种做法和第二种做法有点类似,就是也新增一个Table的Column,不过这次这个column是采用timestamp型,存储数据最后更新的时间。在Oracle9i以后可以采用新的数据类型,也就是timestampwithtimezone类型来做时间戳。这种Timestamp的数据精度在Oracle的时间类型中是最高的,精确到微秒(还没与到纳秒的级别),一般来说,加上数据库处理时间和人的思考动作时间,微秒级别是非常非常够了,其实只要精确到毫秒甚至秒都应该没有什么问题。和刚才的版本戳类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。如果不想把代码写在程序中或者由于别的原因无法把代码写在现有的程序中,也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过程中。


  • Java乐观锁悲观锁、synchronized,重入锁 (ReentrantLock)处理并发(互斥同步、非互斥同步)
回复于: 2011-09-07 09:29:31#14得分:6 引用| 管理 一天十小时
楼上只说了乐观锁的原理。能否说一下数据库 如何加乐观锁?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

Oracle数据库中加锁应该都是悲观锁是吗?[问题点数:40分,结帖人chenchendf]

收藏
    推荐文章
      热点阅读