oracle事务处理


  预习事务处理
  一 事务概念:由一组sql语句组成的一个逻辑工作单元
  二 事务的属性:
    2.1 原子性
        一个事务是一个不可分割的逻辑工作单元,事务所包含的所有工作单元要么不做,要么全做
        例如:银行转账业务。A向B转账,A的账户减少100,B账户增加100,这两个操作要么同事提交,要么都回退
    2.2 一致性
        系统在一个状态变换到另外一个状态,他们的一致性必须保持一直,事务总体上不能破坏特性环境下的任何业务规则
        例如,在AB账户总金额在转账前后始终保持一致,只是有短暂的不一致。这个短暂时间发生在事务提交之前,事务提交
        之后,保持一致。
    2.3 隔离性
        每个事务 都必须独立于其他业务执行
        例如:活动事务所做的改变对并发运行的其他事务来说是不可见的,当A向B转账的同时,C向A转账,若同时进行,则A和B
        之间的一致性不能满足。所以在AB事务执行过程中,其他事务不能访问当前相关的数值。
    2.4 持久性
        确保事务完成之后,对数据的修改是永久性的,即使发生系统故障也不会对其有影响、
        例如:当AB转账完成事务提交之后,就算系统故障,数据已经被修改,转账已经成功、 
    注意:关于隔离性所引起的几个问题
         1  更新结果丢失、在oracle默认级别下,该情况不会发生
              事务1----- 更新数据 2000+200
                   事务2 ----- 更新数据(读取的是没有更新的结果)2000+200
              事务1----- commit 2200
                   事务2 ---- commit 2200
               本来结果应该为2400 ,但是现在只有2200,出现更新结果丢失                             
         2 脏读 在oracle默认级别下,该情况不会发生
            事务1 ---更新数据:2000+200
                 事务2 --更新数据:查询到的数据为2000,实际上已经为2200了,只是事务1没有提交,导致事务2读取的数据错误
                 事务2--commit
            事务1 ---commit
         3 不可重读
           解释:事务1----查询数据
                       事务2---修改数据
                       事务2---commit
                 事务1----查询数据
                 此时会发现事务1中发生两次查询数据不同(数据内容上的不同天)
         4 幻读
            事务1 ----查询数据
                 事务2 ----添加或者删除(insert delete)
                 事务2 ----commit
            事务1-----查询数据
            事务1中两次查询数据条目不同
           
  三 基本的事务处理
   3.1 开始事务
       在oracle中默认状态下,事务是自动启动的,不需要在代码中手动定义,(当我们执行第一句sql代码时,事务自动开启)   
   3.2 执行sql语句
       如果有多条执行语句组成一个事务。那么必须待所有sql都执行成功,那么表示事务可以被提交,否则事务要进行回滚。
   3.3 提交事务
       如果事务中的所有sql都执行成功,可以通过执行commit提交事务
       语句:
        commit;
   3.4 注意:以下情况会自动提交事务
       1 当执行ddl语句时将会自动提交事务。例如 create table alter table 以及drop table
       2 当执行dcl表,

       3 当oracle服务被关闭的时候。
  四  隔离级别
     4.1 未提交读 (Read Uncomited)oracle中最低最危险级别,无法避免脏读现象,但是不允许数据更新丢失
     4.2 提交读(Read Commited)是大多数数据库系统的默认级别。可以避免脏读现象,但是不可避免重复读
     4.3 可重复读取(Repeatable Read)可以避免可重复读取和脏读,但是不可避免幻读。
     4.4 可串行读(Serializable Read)要求事务按照顺序执行,确保事务不被干扰,但是并发性低
  五 数据库中的锁    
   (一)  锁的种类
   5.1 行级共享锁(RS row share):一个用户使用共享锁锁定某一行之后,其他用户也可以对相同列加上共享锁
                            加锁之后,可以查询该行,但是不能修改该行的数据。
     5.2 行级排他锁(RX row exclusive):只允许某一用户对其加锁,其他用户不能再锁定。
          用法 :for update
               通过for update 给sql语句添加排它锁
               例如:select * from emp where empno = 7369 for update;用于锁住编号为7369的一行数据,
               此时,另外的用户来修改该行数据,则会一直等待该条数据释放锁,然后执行修改语句,但是某些
               情况下,用户不希望等待太长时间,这时,可以设定等待时间或者设置不等待
               update set sal = 1000 where empno = 7369 nowait设置不等待模式
               update set sal = 1000 where empno = 7369 wait 10 设置等待10秒
               如果在十秒之后,锁还没有被释放,则停止等待。
     5.3 共享锁 (S share):和行级享锁差不多,只是共享锁锁住的对象是整个表。例如
                           lock table tableName in share mode                              
     5.4 共享更新锁 (in share update mode)       
       
     5.5 排他模式 :只允许某一用户对其加锁,其他用户不能再锁定。不允许其他用户插入、更新和删除行,允许其他表插入数据,          
     (二)锁的级别   
     行级锁:也称事务所,该锁从事务被创建开始,事务提交或者回滚释放。行级锁可以锁定某一行数据    
     表级锁:    
          备注:相应的操作自动产生锁的对象关系
       1 在执行insert update delete语句时,自动产生行级排他锁
       2 在执行create语句时候,自动产生共享锁(S锁)      
       3 在执行alter语句的时候,自动产生排他锁
     
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值