169it科技资讯
169it -->


当前位置:  数据库>oracle

MSSQL与Oracle数据库事务隔离级别与锁机制对比

    来源: 互联网  发布时间:2014-10-04

一,事务的4个基本特征

Atomic(原子性):
事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要
么全部成功,要么全部失败。

Consistency(一致性):
只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初
状态。

Isolation(隔离性):
事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正
确性和完整性。同时,并行事务的修改必须与其他并行事务的修改
相互独立。

Durability(持久性):
事务结束后,事务处理的结果必须能够得到固化。

以上属于废话

二,为什么需要对事务并发控制

如果不对事务进行并发控制,我们看看数据库并发操作是会有那些异常情形

Lost update:
两个事务都同时更新一行数据,但是第二个事务却中途失败退出,
导致对数据的两个修改都失效了。

Dirty Reads:
一个事务开始读取了某行数据,但是另外一个事务已经更新了此数
据但没有能够及时提交。这是相当危险的,因为很可能所有的操作
都被回滚。

Non-repeatable Reads:
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。

Second lost updates problem:
无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其
中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成
第一次写操作失效。

Phantom Reads:
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查
询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是
因为在两次查询过程中有另外一个事务插入数据造成的。

三, 数据库的隔离级别

为了兼顾并发效率和异常控制,在标准SQL规范中,定义了4个事务隔
离级别,(ORACLE和SQLSERER对标准隔离级别有不同的实现 )

Read Uncommitted:
直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别
的事务可以读到这个改变.这是很不安全的.

Read Committed:
直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后
别的事务就能读到这个改变.

Repeatable Read:
直译就是"可以重复读",这是说在同一个事务里面先后执行同一个
查询语句的时候,得到的结果是一样的.

Serializable:
直译就是"序列化",意思是说这个事务执行的时候不允许别的事务
并发执行.

四,隔离级别对并发的控制

下表是各隔离级别对各种异常的控制能力。
LU DR NRR SLU PR
RU Y Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N

(注:LU:丢失更新;DR:脏读;NRR:非重复读;SLU:二类丢失更新;PR:幻像读)

顺便举一小例。

MS_SQL:

--事务一
set transaction isolation level serializable
begin tran
insert into test values('xxx')

--事务二
set transaction isolation level read committed
begin tran
select * from test

--事务三
set transaction isolation level read uncommitted
begin tran
select * from test

在查询分析器中执行事务一后,分别执行事务二,和三。结果是事务二会等待,而事务三则会执行。

ORACLE:

--事务一
set transaction isolation level serializable;
insert into test values('xxx');
select * from test;

--事务二
set transaction isolation level read committed--ORACLE默认级别
select * from test

执行事务一后,执行事务二。结果是事务二只读出原有的数据,无视事务一的插入操作。

读者是否发现MS_SQL和ORACLE对并发控制的处理有所不同呢?

五,锁

下表是锁的兼容或冲突情形。
现有 S U X
请求
S Y Y N
U Y N N
X N N N

现有 S U X
申请    
S  Y Y N
U  Y N N
X  N N N

oracle:
 


六,注意点
 
一般处理并发问题时的步骤:
1、开启事务。
2、申请写权限,也就是给对象(表或记录)加锁。
3、假如失败,则结束事务,过一会重试。
4、假如成功,也就是给对象加锁成功,防止其他用户再用同样的方式打开。
5、进行编辑操作。
6、写入所进行的编辑结果。
7、假如写入成功,则提交事务,完成操作。
8、假如写入失败,则回滚事务,取消提交。
9、(7.8)两步操作已释放了锁定的对象,恢复到操作前的状态。
 
对多表的操作最好一起取得锁,或则保证处理顺序;个人感觉还是前者好,虽然效率低一些

七,附
查看锁
ORACLE:

select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status
from v$locked_object l, all_objects a
where l.object_id=a.object_id;

MS_SQL:

EXEC SP_LOCK


    
相关技术文章:
    ▪Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作

     一、修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/limits.conf,按i键进入编辑模式,将下列内容加入该文件。 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 编辑完成后按Esc键,输入“:wq”存盘退出 2)修改/etc/pam.d/login 文件,输入命令:vi /etc/pam.d/login,按i键进入编辑模式,将下列内容加入该文件。 session required /lib/security/pam_limits......


    ▪Oracle数据库表名支持的最大长度是多少

     本文介绍Oralce数据库中,表名可以使用的最大长度。这个长度也是Oracle标识符的最大长度,为30个字符。 小编今天在建一个Oracle数据库表时,提示如下表名长度超过了最大值了。错误如下: 代码如下: 错误报告: SQL 错误: ORA-00972: 标识符过长 00972. 00000 -  "identifier is too long" *Cause:    An identifier with more than 30 characters was specified. *Action:   Specify at most 30 characters. 从这个错误提示可以看出来: 1、所谓标识符,即用户自定义的关键词,比较表名、字段名、视图名、序......


    ▪Oracle硬解析和软解析的区别分析

     一、摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析。 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限)。 Step2. 将SQL代码的文本进行哈希得到哈希值。 Step3. 如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进行软解析,否则到e步骤。 Step4. 对于存在相同哈希值的......


 
最新技术文章:
    ▪Oracle 系统变量函数介绍

     Oracle函数多种多样,系统变量函数就是其中之一,下面就为您介绍三种最常见的系统变量函数,希望对您学习Oracle能有所帮助。 Oracle系统变量函数: (1)SYSDATE 该函数返回当前的日期和时间。返回的是Oracle服务器的当前日期和时间。 select sysdate from dual; insert into purchase values (‘Small Widget','SH',sysdate, 10); insert into purchase values (‘Meduem Wodget','SH',sysdate-15, 15); 查看最近30天的所有销售记录,使用如下命令: select * from purchase where purchase_date between (sysdate-30) and sysdate; (2)USER ......


    ▪oracle trunc()函数的使用方法

     oracle trunc()函数是最常用的函数之一,下面就为您介绍oracle trunc()函数的用法,供您参考,希望可以让您对oracle trunc()函数有更深的认识。 1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值。 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date一个日期值 fmt        日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去 下面是该函数的使用情况: TRUNC(TO_DATE('24-Nov-1999 08:00 pm','dd-mon-yyyy hh:mi am'))         ='24-Nov-1999 12:00:00 am' TRUNC(TO_DATE('24-Nov-1999 08:37 pm','dd-mon-yyyy hh:mi am'......


    ▪ORACLE学习笔记-新建用户及建表篇

     一、用户相关SQL语句 /*新建用户*/ create user SA identified by 2013; 说明:SA用户名,2013密码 /*授权connect,resource给用户sa*/ grant connect,resource to sa; 说明:CONNECT角色: --是授予最终用户的典型权利,最基本的 。         ESOURCE 角色: --是授予开发人员的 /*查询所有的用户*/ select * from all_users; /*将表STU查询权限授予SA*/ GRANT SELECT ON STU TO SA /*将表STU添加......


 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号