zoukankan      html  css  js  c++  java
  • 数据库事务的学习(二)

    一、事务的ACID特性
       首先事务是一个逻辑上的工作单元,同一组sql语句,他们要么作为一个单元被提交,要么作为一个单元被回滚。使用update在2个银行账号进行转账的例子已经叙述过,这2个Update语句必须同时被提交或回滚;否则,就可能丢钱了。

        严格的定义为,事务有4个基本特性,成为ACID特性。
    ①atomicity原子性 事务必须承租的提交或者回滚,因此事务是原子的。一个事务中包含的所有sql语句都是一个不可分割的单元;

    ②consistency一致性 必须确保数据库的状态保持一致。就是说事务开始时,数据库的状态是一致的;在事务结束时,数据库的状态也必须是一致的;

    ③isolation隔离性多个事务可以独立运行,而不会被彼此产生影响;

    ④durability一旦事务被提交之后,数据库的变化就会被永远保留下来,即使运行数据库软件的机器后来崩溃也是如此。



    二、并发事务 
     oracle数据库支持多用户同时与数据库进行交互,每个用户都可以同时运行自己的事务。这种事务就成为并发事务。

      如果用户同时运行多个事务,而这些事务都对同一个表产生影响,那么这些事务的影响都是独立的。直到执行一条commit语句时才会彼此产生影响。
    ①T1:
    select min(t.id)
    from teacher t
    --------
    5


    ②T1:
    insert into teacher 
    values(1,'15555555555','测试')
    ---------
    无commit;

    ③T2:
    select min(t.id)
    from teacher t:
    -----------
    5

    ④T1:COMMIT;

    ⑤T2:select min(t.id)
    from teacher t
    ------------
    1
    --------以上在rapidsql两个对话框中进行测试,都以用户edu登录到数据库上,输入以上数据。按照表中所给出的交叉次序在session对话框中输入这些数据;


    三、事务锁
       要支持并发事务,oracle数据库必须保持表中的数据一直有效。可以通过锁来实现。两个事务同时修改teacher表中id=1的记录:
    (1)T1执行一条update语句修改id=1的记录,但是呢,T1并没有执行commit语句。此时就称T1对该行加锁了。

    (2)T2也试图执行一条UPDATE语句修改id=1的记录,但是由于该行早已被T1加锁,那么T2就不能获得该行的锁。T2的update语句必须一直等,知道T1结束并释放该行上的锁为止。

    (3)T1执行commit语句并结束,从而释放该行上的锁。

    (4)T2获得该行上的锁,并执行update语句。T2获得该行上的锁一直持有,知道T2结束为止。
      
    当一个事务已经拥有某一行上的锁时,另外一个事务不能获得该行上的锁。


    默认的加锁机制:读程序不会阻塞读程序;写程序不会阻塞读程序;只有在试图对相同的行进行修改时,写程序才会阻塞写程序。

    edit on 2010-08-31

  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/gracejiang/p/5890457.html
Copyright © 2011-2022 走看看