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. mysql rand随机查询记录效率

    一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的 ...

  2. API地图坐标转化(批量转换坐标)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. 查找指定表的字段not null约束,并生成删除Sql

    SElECT 'ALTER TABLE '+OBJECT_NAME(c.parent_obj)+' DROP CONSTRAINT '+ c.name FROM sys.sysconstraints ...

  4. 11g RAC R2 体系结构---进程,日志

    进程结构:Overview of Oracle Clusterware Platform-Specific Software Components When Oracle Clusterware is ...

  5. (转)使用getevent监听Android输入设备文件

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节Android事件分发完全解 ...

  6. 【译】Android系统简介

    简介  本文主要介绍Android的基础知识和体系结构,本文主题: 简介什么是Android,为什么开发者需要关注Android: Android体系结构(如Linux Kernel, Librari ...

  7. 【转】如何在 Windows 中执行干净启动

    完成故障排除后,请执行以下步骤将计算机重置为正常启动. Windows 8.1 和 Windows 8 从屏幕右边缘滑入,然后点按“搜索”.您也可以将鼠标指向屏幕的右下角,然后单击“搜索”. 在搜索框 ...

  8. [JAVA][RCP]Clean project之后报错:java.lang.RuntimeException: No application id has been found.

    Clean了一下Project,然后就报了如下错误 !ENTRY com.release.nattable.well_analysis 2 0 2015-11-20 17:04:44.609 !MES ...

  9. odp.net以及oracle oledb安装

    连接Oracle数据库需要Oracle数据访问组件(ODAC). 1. 下载ODAC:http://www.oracle.com/technetwork/cn/database/windows/dow ...

  10. http概述

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...