Oracle锁没有额外的开销?Oracle的锁是怎么实现的?因为其他数据库,锁都是一种稀有资源和开销。

答:代码级实现??

没有锁的话,并发更新就会有丢失更新的问题。

悲观锁和乐观锁

悲观锁一般用于有状态,有连接的环境下,通常是客户/服务器系统。在更新会话中使用SELECT FOR UPDATE 锁定要更新的那一行。

乐观锁,只有在要更新的时候,才去锁定行。

为了防止出现丢失更新,乐观锁一般采用如下方法。

1.在DML中带上旧值, 比如

UPDATE EMP

SET SALARY = :sal

WHERE empno= :no AND salary= :old_sal

这样的话,如果其他用户已经修改了这一行,那么这个UPDATE就不会修改任何行。

2.增加一个版本列,一般是NUMBER类型或DATETIME 时间戳类型

方法与#1一样,UPDATE的时候在WHERE子句中加上 这个时间戳列

3.校验和
对要更新的这一行,计算一个hash值,ORA_HASH

何时适用悲观锁和乐观锁

(1) 客户/服务器模式适用悲观锁定, 用户不多。

(2) 遗留系统,既有客户/服务器系统(已经使用了悲观锁),又有web访问的系统,那么web系统要适用乐观锁,适用ORA_HASH的方法, 因为我们不希望修改数据库,增加一列,这样遗留系统也要修改。

(3) 其他系统都使用乐观锁。

怎么避免阻塞和死锁

会产生阻塞的语句只有:SELECT
FOR UPDATE, INSERT, DELET, UPDATE, MERGE

(1)   
用SELECT FOR UPDATE NO WAIT

(2)   
INSERT 很少会产生死锁,除了用户自己生成主键的情况,有重复主键同时要插入数据库

(3)   
UPDATE/DELETE/MERGE 可以通过先执行一下 SELECT FOR UPDATE NOWAIT避免。

Oracle 6 - 锁的更多相关文章

  1. Oracle的锁表与解锁

    Oracle的锁表与解锁 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) ...

  2. 从浅到深掌握Oracle的锁

      1.分别模拟insert,update和delete造成阻塞的示例,并对v$lock中的相应的信息进行说明,给 出SQL演示. Insert示例 会话:SQL> select * from ...

  3. Oracle 6 - 锁和闩 - 锁类型

    Oracle锁大类 1.DML锁 (SELECT, INSERT, UPDATE, DELETE, MERGE是对数据库加的锁, 可能是行锁,也可能是表锁) 2.DDL锁 (Create, Alter ...

  4. ORACLE里锁有以下几种模式,v$locked_object,locked_mode【转】

    ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4: ...

  5. oracle查询锁表解锁语句

    --oracle查询锁表解锁语句--首先要用dba权限的用户登录,建议用system,然后直接看sql吧 --1. 如下语句 查询锁定的表: SELECT l.session_id sid, s.se ...

  6. ORACLE的锁机制

    数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据 ...

  7. ORACLE里锁有以下几种模式,v$locked_object,locked_mode

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share  3:Row-X 行独占(RX):用于行的修改,sub exclusiv ...

  8. Oracle系列-锁表与解锁解决方案(大招版)-解决问题才是王道

    [Oracle系列-锁表与解锁解决方案(大招版)] --1查看被锁的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$l ...

  9. Oracle系列-锁表与解锁解决方案(基础版)

    [Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...

随机推荐

  1. 躲避球游戏ios源码

    躲避球游戏源码,有限源码是一个基于cocos2d的躲避球游戏源码的,并且还引用了大家熟悉google广告的,进行推广,已经还有带game center等,游戏操作很简单,用手指按住物体,然后移动物体避 ...

  2. laravel步骤 (我是新手)

    1/需要一个wnmp之类的虚拟服务器 2/创建路由   php artisan make:route routes Route::group(['middleware' => ['web','a ...

  3. html关于强制显示 隐藏浏览器的滚动条

    浏览器的滚动条在一些特殊的展示中,是不需要的,所以必须把它隐藏掉,文章主要介绍一些隐藏或者显示IE的水平或者垂直滚动条的实现代码,需要了解的朋友可以参考下: 相关css代码如下: //强制显示滚动条: ...

  4. Jquery操作Cookie取值错误的解决方法

    使用JQuery操作cookie时 发生取的值不正确,结果发现cookie有四个不同的属性,分享下错误的原因及解决方法. 使用JQuery操作cookie时 发生取的值不正确的问题:  结果发现coo ...

  5. 转:const“变量”、define的常量和static 变量

    首先讲C编译器的内存分配: 代码区 数据区 用户区=线程栈+堆 其中的数据区存储:常量(define)+静态变量(static)+符号集(const)+全局变量   然后讲一下编译的大致顺序: 注释- ...

  6. 关于angularJS与jquery在使用上的一些感悟

    最近做的项目中,有同时用到angularJS与jquery两种JS框架. 在使用过程中发现,angularJS的用法更像是面向对象的编程模式.它会要求你定义一个view model,然后所有的页面变化 ...

  7. 最强Android模拟器genymotion的安装与配置

    Android开发人员都知道,原生的模拟器启动比较慢,操作起来也不流畅,还会出现莫名的问题.当然很多人都会选择直接使用android手机来开发,但是有时候需要在投影仪上演示程序的时候手机不太好做到吧. ...

  8. 【转载】Powershell在世纪互联Office365中批量将用户添加到组

    $NewUserPath = ".\Office365AddUserToGroup.csv" $NewUsers = import-csv $NewUserPath foreach ...

  9. 导入导出Android手机文件

    1.获得root权限:adb root: 如提示adbd cannot run as root in production builds,参见我的另一篇文章:http://www.cnblogs.co ...

  10. Async详解之一:流程控制

    为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...