zoukankan      html  css  js  c++  java
  • Oracle事务和锁

    Oracle事务和锁

    1.事务的概念:

     事务用于保证数据的一致性,它由一组相关的dml(数据操作语言[增删改])语句组成,该组的dml语句要么全部成功。要么全部失败。

          *事务的特性有四个:ACID
    原子性atomicity:语句级原子性,过程级原子性,事务级原子性
    一致性consistency:状态一致,同一事务中不会有两种状态
    隔离性isolation:事务间是互相分离的互不影响(这里可能也有自治事务)
    持久性durability:事务提交了,那么状态就是永久的

          *只读事务 :
    只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
         设置只读事务: set transaction read only;

     

    2. 事务的优点:

    把逻辑相关的操作分成了一个组。

    在数据永久改变前,可以预览数据变化。

    能够保证数据的读一致性。

        COMMIT操作把多个步骤对数据库的修改,一次性地永久写入数据库,代表数据库事务的成功执行。

        ROLLBACK操作在发生问题时,把对数据库已经作出的修改撤消,回退到修改前的状态。在操作过程中,一旦发生问题,如果还没有提交操作,则随时可以使用ROLLBACK来撤消前面的操作。

        SAVEPOINT 则用于在事务中间建立一些保存点,ROLLBACK可以使操作回退到这些点上边,而不必撤销全部的操作。一旦COMMIT完成,就不能用ROLLBACK来取消已经提交的操作。一旦ROLLBACK完成,被撤消的操作要重做,必须重新执行相关操作语句。

    数据库事务

    3.数据库锁

        *Oracle数据库中的锁机制

         数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

        在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。

        * Oracle数据库锁分类(根据保护对象的不同):

    (1) DML lockdata locks,数据锁):用于保护数据的完整性;

    (2) DDL lockdictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);

    (3) Internal locks latches(内部锁与闩):保护内部数据库结构;

    (4) Distributed locks(分布式锁):用于OPS(并行服务器)中;

    (5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

           Oracle中最主要的锁是DML(也可称为data locks,数据锁)锁。DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

          锁出现在数据共享的场合,用来保证数据的一致性。当多个会话同时修改一个表时,需要对数据进行相应的锁定。锁有“只读锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁” (一次锁住一条记录),“页级锁” (一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁” (锁住整个表)

          若为“行级排它锁”,则除被锁住的行外,该表中其他行均可被其他的用户进行修改(Update)或删除(delete)。若为“表级排它锁”,则所有其他用户只能对该表进行查询(select)操作,而无法对其中的任何记录进行修改或删除。当程序对所做的修改进行提交(commit)或回滚(rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。

    4. 事务和锁

    当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其他用户改变表的结构。

    提交事务:当执使用commit语句可以提交事务.当执行了commit语句之后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务之后,其他会话将可以查看到事务变化后的新数据;

    savepoint  保存点名称;     --创建一个保存点

    rollback to 保存点名称;         --回滚到保存点

    回滚事务

    当执行rollback,通过指定保存点可以回退到指定的点

    rollback      --取消全部事务

    commit之后不能rollback

     

     

     

  • 相关阅读:
    OC-内存管理-基本原理与引用计数器
    OC-改错题
    OC-Q&A
    OC-SEL
    CO-类的本质、description方法
    Tomcat 下 mysql的连接池配置和使用
    转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
    使应用程序常驻内存,不能被任务管理器关闭之配置文件设置
    解决Tomcat catalina.out 不断成长导致档案过大的问题
    >/dev/null 2>&1的含义
  • 原文地址:https://www.cnblogs.com/riskyer/p/3297256.html
Copyright © 2011-2022 走看看