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

  • 相关阅读:
    2020十一届蓝桥杯-七月省赛题解
    ES6 Generator与C#迭代器
    .NET Core微服务部分知识点
    js点击图片传给一个空的div内放大显示
    Jmeter 中 CSV 如何参数化测试数据并实现自动断言
    安装nvidia-docker2报错E: Unable to locate package nvidia-docker2
    微信小程序-点击事件传递参数
    2020牛客暑期多校训练营(第八场)I Interesting Computer Game K Kabaleo Lite
    Count the Colors
    Basic Gcd Problem
  • 原文地址:https://www.cnblogs.com/gracejiang/p/5890457.html
Copyright © 2011-2022 走看看