• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MSSQL与Oracle数据库事务隔离级别与锁机制对比

    一,事务的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

    您可能感兴趣的文章:
    • ORACLE数据库事务隔离级别介绍
    • oracle 合并查询 事务 sql函数小知识学习
    • Oracle中死事务的检查语句
    • Java与Oracle实现事务(JDBC事务)实例详解
    • ORACLE中如何找到未提交事务的SQL语句详解
    上一篇:oracle报错(ORA-00600)问题处理
    下一篇:Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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