关键字:ORACLE, SQL SERVER, 锁定, Before Image, ISOLATION LEVEL, NOLOCK, ORA-01555

一、ORACLE 非阻塞查询与Before Image一个用户对表数据进行修改,但尚未提交;

另一个用户仍然可以自由地对表进行非阻塞查询,查询结果是提交前的数据,即 ISOLATION LEVEL READ COMMITED。

但如果后者试图修改正在被前者修改的数据,就会被立即锁住,等待前者提交或放弃修改。

这里使用的是ORACLE所特有的非阻塞查询技术:Before Image/Rollback Segment/UNDO Tablespace

!长时间运行的查询会遇到的错误情形分析:用户A启动事务,修改某行记录,但还没有提交;此时会产生Before Image数据。

在查询启动时,修改还没有提交。

用户B启动一个SELECT查询,逐行返回记录,其中就将包括被用户A所修改的记录...

一段时间后,用户A提交了事务;

又一段时间后,这行记录的Before Image数据空间被其它数据覆盖;

最后,用户B的查询游标终于来到这行记录,但此时这行记录的在用户B开始查询时刻的Before Image数据已经不存在了,查询就会失败,返回著名的 ORA-01555 Snapshot too old 错误。

二、SQL SERVER的情形

一个用户对表数据进行修改,但尚未提交;另一个用户查询 select count(*) from t 也会被锁定!

这对于一直使用ORACLE,刚接触SQL SERVER的用户,是很难理解的。其根本原因就在于SQL SERVER没有类似 Before Image 的机制。

对此SQL SERVER的解决办法:

(1)使用行级锁。

好像较新版本的SQL SERVER(2000以及后续版本?)会自动使用行级锁。这样,虽然全部查询会被锁定等待,但查询其它行会立即得到结果。

(2)不太严谨的做法是使用 NOLOCK

写法: select ... from ... with(NOLOCK)

效果: 不会被锁定,立即返回结果。

看起来不错,是吗?但是,等等,效果根本不能与ORACLE相比!

NOLOCK等价于 ISOLATION LEVEL READ UNCOMMITED. 这会产生很多问题,必须谨慎使用![@more@]

开发SQL SERVER数据库应用的原则:

基于以上分析,原则为:应当尽量写短小的事务处理语句,以免长时间锁定其它事务。

写到这里,似乎明白了SQL SERVER缺省事务行为为何与ORACLE不相同了:ORACLE: 缺省非Auto COMMIT,直到显示提交为止。

MS SQL: 缺省是Auto COMMIT,每条语句执行后,自动提交。

oracle数据库SQL防止超长,SQL Server和Oracle防止数据锁定的比较相关推荐

  1. 把Oracle数据库移植到Microsoft SQL Server 7 0

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 把Ora ...

  2. winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...

    远程连接Oracle数据库的配置文件及sql语句 近期,应朋友的要求,用C#语言开发了一个winform应用程序,要求的是连接到远程的Oracle数据库,用惯了SQL Server的我突然有点懵,然后 ...

  3. python读取oracle数据库中文乱码_PL/SQL连接Oracle数据库,中文乱码,显示问号

    PL/SQL连接oracle数据库 1.简单介绍 在不安装oracle数据库的情况下使用pl/sql连接远程oracle数据库. 2.详细步骤: a)      安装PL/SQL.依据自己的操作系统安 ...

  4. Oracle数据库查看表空间sql语句、查看Oracle数据库表空间剩余 、修改表空间、库备份

    一  Oracle数据库查看表空间sql语句 1.oracle查看表空间当前用户 SQL>  select  username,default_tablespace  from user_use ...

  5. Oracle数据库使用Analyze提升sql性能

    Oracle数据库使用Analyze提升sql性能 如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会.假设你创建了一张拥有100万条记录的临 ...

  6. oracle数据库等级,[数据库]Oracle数据库建表并用SQL编程分等级

    [数据库]Oracle数据库建表并用SQL编程分等级 0 2016-06-15 23:00:13 --创建学生表 create table XS_543 ( XH char(6) not null , ...

  7. idea如何给oracle添加数据_intelij idea下使用java和JDBC连接oracle数据库及简单的SQL操作...

    intelij idea下使用java和JDBC连接oracle数据库及简单的SQL操作 发布时间:2018-07-04 10:09, 浏览次数:2532 , 标签: intelij idea jav ...

  8. Oracle数据库学习:PL/SQL(详解)

    Oracle数据库学习:PL/SQL 什么是PL/SQL PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的扩展语言; 使用PL/SQL 可以编写具 ...

  9. oracle - - 注释符,Oracle数据库扩展语言PL/SQL之注释、分隔符和标识符

    点击蓝字关注我吧 [本文详细介绍了Oracle数据库扩展语言PL/SQL的注释.分隔符和标识符,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 注释 注释不会被数据库编译,只是给开发人提供一 ...

  10. mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例

    [学习笔记]Oracle数据库10049用于分析SQL解析笔记案例 时间:2016-11-05 13:54   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Oracle研究 ...

最新文章

  1. [LeetCode] Sum of Two Integers 两数之和
  2. Flex通用克隆(clone)方法
  3. 【Android】Activity的四种launchMode
  4. python学习-字典(哈希表、创建、插值、取值、keys、values、items、copy、fromkeys)
  5. Windows Phone 7 开发积累_04
  6. WinSCP断线,WinSCP总是断线,断线重连过程又需要卡很长时间解决办法
  7. Spring源码总结与分析
  8. 数据实验室:让您的数据获得真正的价值
  9. java配置struts2_[Java教程]struts2配置
  10. 光耦驱动单向可控硅_光耦继电器在信号传输方面的优势!
  11. 完成端口(Completion Port)详解
  12. 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
  13. verilog 实战 与非门
  14. 201509281125_《为什么移动app会很慢的深度分析(摘自司徒正美博客园文章)》
  15. 培训python开发 骗局
  16. Java 实现循环输入商品编号和购买数量,当输入n时结账,结账时计算应付金额并且找零
  17. unirech阿里云国际版元宇宙解决方案
  18. 7月18日服务器维护时,2018年7月18日维护公告
  19. EC11旋转编码器驱动程序
  20. C / C ++和应用程序中的INT_MAX和INT_MIN

热门文章

  1. Sublime 3 如何使用列编辑模式
  2. nginx配置ssl证书的方法
  3. 直接选择排序(Straight Selection Sort)
  4. delphi 获取驱动盘的卷标 号
  5. 一个用户在同一时间只能登录一次
  6. 怎样成为优秀软件模型设计者
  7. 【学堂在线数据挖掘:理论方法笔记】第五天(3.29)
  8. wxpython控件自适应窗口大小
  9. 利用Python把遥感影像的某几个波段合成
  10. arcgis将一个shp图层导出为多个shp