`

ORACLE FOR UPDATE与FOR UPDATE OF区别(转载)

    博客分类:
  • DB
 
阅读更多

原文地址:http://blog.sina.com.cn/s/blog_61cd89f60102e7di.html

 

在生产数据库中,我们为了保证数据读、写的唯一性,经常会碰到下面五种锁语句,区别在那?相信对于新手而言真正搞懂的不多,下面我们用实例说明一下:

    1.FOR UPDATE、

    2.FOR UPDATE OF COLUMN、

    3.FOR UPDATE WAIT 3、

    4.FOR UPDATE NOWAIT、

    5.FOR UPDATE NO WAIT SKIP LOCK

 

先看几个例子:

  1.select * from Table for update --锁定表的所有行,只能读不能写
  2.select * from Table where pkid = 1 for update --只锁定pkid=1的行
  3.select * from Table a join Table b on a.pkid=b.pkid for update-- 锁定两个表的所有记录
  4.select * from Table a join Table b on a.pkid=b.pkid where a.pkid = 10 for update --锁定两个

      --表的中满足条件的行
  5. select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只锁定Table1中满足条件的行


  for update 是把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表

 

第一点:

    对于单个表读写操作而言,FOR UPDATE与FOR UPDATE OF COLUMN这两语句是一样的,不加条件是全表锁定,加条件是对行级别的锁定,我们举个例子

    SELECT * FROM TABLE FOR UPDATE

    SELECT * FROM TABLE FOR UPDATE OF TABLE_COLUMN

    上面两个没有加WHERE条件,是对全表进行锁定

    SELECT * FROM TABLE WHERE TABLE_COLUMN='条件' FOR UPDATE[FOR UPDATE OF COLUMN]

    此时查询加了查询条件,是对表符合条件记录的一种行级别的锁定

 

    再次提醒,FOR UPDATE 与FOR UPDATE OF 对于单表操作是一样的

 

    那么FOR UPDATE OF 与 FOR UPDATE的区别在那呢,在多表进行操作时,FOR UPDATE OF只锁定列所在的表进行锁定,而且是表级别的锁定,FOR UPDATE是对多个表进行锁定,不懂看例子

   1.select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid

   2.select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update

   1与2的区别在于,1只锁定表a,而2却要把两个表都要锁定,这才是二者真正的区别所在,即for update 是

   把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表

 

第二点:关于NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT)


    当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并立即结束 STATEMENT而不再等待).
    WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
  “使用FOR UPDATE WAIT”子句的优点如下:
  1.防止无限期地等待被锁定的行;
  2.允许应用程序中对锁的等待时间进行更多的控制。
  3.对于交互式应用程序非常有用,因为这些用户不能等待不确定
  4.若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

分享到:
评论

相关推荐

    数据库oracle for update of和for update的区别

    ### 数据库Oracle锁:FOR UPDATE OF与FOR UPDATE的区别 在Oracle数据库中,为了确保数据的一致性和准确性,尤其是在多用户环境中进行并发操作时,锁机制是必不可少的一部分。本文将详细介绍`FOR UPDATE`与`FOR ...

    for_update_和_for_update_nowait_的区别

    标题和描述均聚焦于Oracle数据库中`FOR UPDATE`与`FOR UPDATE NOWAIT`两种锁定机制的区别,这在并发控制和事务处理中具有重要的意义。在深入解析这两种指令之前,我们先来简要回顾一下锁定机制的基本概念。 在...

    oracle的update的五种方式

    例如:`BEGIN FOR cr IN (SELECT * FROM t_join_situation WHERE year='2011') LOOP UPDATE t_join_situation SET join_state='1' WHERE current of cr; END LOOP`。这种方式适用于大批量数据的更新,但需要注意游标...

    oracle执行update语句时卡住问题分析及解决办法

    这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...

    update语句的优化-oracle .pdf

    在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识点进行详细的阐述: 1. 标准update语法优化: 当面对单表更新或较简单的SQL语句时,可以直接使用...

    ORACLE_UPDATE_语句语法与性能分析

    在Oracle数据库中,UPDATE语句是用于修改已存在数据的基本操作之一。在上述示例中,我们看到三种不同的UPDATE语句形式,它们各自处理特定的情况并具有不同的性能特点。 1) **最简单的形式**: 这种情况下,我们更新...

    ORACLE多表关联的update语句

    在Oracle数据库中,多表关联的UPDATE语句用于更新一个表中的数据,这些数据依赖于另一个或多个表的记录。这种操作在数据整合、错误修正或者数据同步时非常常见。以下我们将详细探讨如何使用不同方式执行多表关联的...

    ORACLE_多表关联_UPDATE_语句

    Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的关键技术。这在处理复杂的数据同步或修正场景时非常有用。在本例中,我们将探讨如何利用多表关联来更新数据,并通过...

    ORACLE UPDATE 语句语法与性能分析看法

    ### ORACLE UPDATE 语句语法与性能分析 #### 引言 在数据库管理与操作中,`UPDATE`语句是SQL语言中极为重要的组成部分,它允许我们修改已存在的记录,从而保持数据的时效性和准确性。Oracle数据库作为企业级应用中...

    DataX-Oracle新增writeMode支持update

    DataX-Oracle新增writeMode支持update的两个jar包已经修改好,使用方法可以看https://blog.csdn.net/qq_36802726/article/details/137118015

    Oracle Server JRE 7 Update 55

    Oracle Server JRE 7 Update 55 是Oracle公司发布的一款针对Java运行环境(Java Runtime Environment)的更新版本,主要用于在Windows x64平台上支持Oracle服务器的运行。JRE是Java应用程序能够在任何兼容的计算机上...

    oracle 多表做update insert语句.docx

    Oracle 多表 Update 语句详解 在 Oracle 中,Update 语句是数据库操作中的重要组成部分。 Update 语句可以对数据库中的数据进行修改,更新和插入。今天,我们将讨论 Oracle 中的 Update 语句,包括 Update 语句的...

    Oracle Linux Release 6 Update 2 for x86_64 (64 Bit).part06.rar

    Oracle发布的Linux,内核支持asm driver

    Oracle Provider for OLE DB Developer’s Guide 11g (11.2)

    1. **安装与配置**:包括Oracle Provider for OLE DB的下载、安装步骤,以及在开发环境中配置所需的环境变量和连接设置。 2. **连接管理**:讲解如何创建和管理数据库连接,包括使用连接字符串、身份验证机制(如...

    oracle中UPDATE nowait 的使用方法介绍

    在Oracle数据库中,`UPDATE NOWAIT` 是一个用于事务处理的关键字,它允许你更新一行数据,但在数据被其他事务锁定时,它不会等待而是立即返回一个错误信息。这个特性对于处理多线程并发和确保数据一致性至关重要。...

    Statement Tracer for Oracle,oracle代码跟踪工具

    "Statement Tracer for Oracle"是一个专门针对Oracle数据库的代码跟踪工具,它帮助开发者和DBA深入分析SQL语句的执行情况,从而提高数据库性能和解决问题。 Statement Tracer for Oracle的主要功能包括: 1. **...

    Oracle SQL(SQL for Oracle)

    这本书“Oracle SQL(SQL for Oracle)”显然是为了帮助读者深入理解和掌握在Oracle环境中有效使用SQL。 在Oracle SQL中,有以下几个关键知识点: 1. **数据类型**:Oracle支持多种数据类型,包括数值型(如NUMBER...

    oracle10 for linux 安装

    在整个过程中,保持与Oracle官方文档的同步,以获取最新的兼容性和安全建议。记住,安装和管理Oracle数据库需要谨慎操作,避免对生产环境造成任何不必要的影响。如果你在安装或配置过程中遇到问题,可以查阅Oracle的...

    shell连接oracle数据库执行SQL工具脚本-支持select+inset+update

    shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...

    解析mysql与Oracle update的区别

    在数据库管理领域,MySQL和Oracle都是广泛使用的数据库系统,它们在很多方面有着相似的功能,但在某些特定操作上,比如多表更新(update),两者存在一些差异。本文将深入解析MySQL和Oracle在多表更新时的不同之处。...

Global site tag (gtag.js) - Google Analytics