• 40.oracle事务


    一、事务特性

    事务必须具备以下四个特性,简称ACID属性

    1. 原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分割的(原子的);要么都执行,要么都不执行
      场景:银行转账 A-100 B+100,同时成功或失败。
    2. 一致性(Consistency):一个查询的结果必须与数据库在查询开始的状态一致(读不等待写,写不等待读。)
      场景:下午1点查询数据,1点半查出结果,这期间有人更新了数据,那么1点半查出来的数据不会是更新后的数据,会把undo里的相关数据返回
    3. 隔离性(isolation):对于其他对话来说,未提交的事务必须不可见。
      场景:A和B在各自的session中做任何操作,只要没有提交,相互之间没有任何影响。
    4. 持久性(Durability):事务一单提交完成,数据库不会丢失这个事务的结果,数据库通过日志能够保持事务的持久性。
      场景:事务提交后不可逆,提交数据是有内存的数据刷新到磁盘上,这个过程快慢和性能有关。那么oracle主要是靠rudo日志,先记录到日志,再写到磁盘上。

     二、事务的开始和结束

    事务采用隐性的方式,起始于session的第一条DML语句,

    查看事务:select * from v$transaction;

    事务结束于提交或者回滚:

    1. commit或者rollback
    2. ddl语句被执行
    3. dcl语句被执行
    4. 用户退出sqlplus(提交【正常退出】或者回滚)
    5. 机器故障(回滚)
    6. shutdown immediate(回滚)

    三、锁

    锁分为共享锁和排他锁

    排他锁(独占),排斥其他的排他锁和共享锁。

    共享锁:排斥其他排他锁,但不排斥其他共享锁。

    锁类型:

      DML锁(data locks,数据 锁),用于保护数据的完整性,TX(行级锁),TM(表级锁),日常使用的DML操作就会产生事务和锁。

      查看事务:select * from v$transaction;

      查看锁:select * from v$lock

      DDL锁(dictionary locks,数据字典锁):用户保护数据库对象的结构,如表、索引等结构定义。

      SYSTEM锁(internal locks and latches):保护数据库的内部结构

    用途:只有事务才会产生锁,保证数据完整性和正确性。

    四、加锁的模式

    自动加锁,做DML操作时,如insert,update,delete,以及select .... for update 由oracle自动加锁。

      select * from emp where deptno=10 for update;

    部门为10 的记录会被锁定,我们可以进行试探要修改的数据是否被加锁:

    • select * from emp where empno=7782 for update nowait;
    • select * from emp where empno=7782 for update wait 5;
    • select * from emp where job='CLERK' for update skip locked;

    如果这个锁占用的时间很长,我们可以通过管理员kill掉session用户。

    1. 首先在v$lock表中查看是哪个id占用了太长时间
    2. 根据v$lock的¥id,去v$session里找到,进行kill
      select sid,serial# from v$session where sid=170
      alter system kill session 'sid,serial'

    下图使用for update 数据被锁住(注意标注的地方):

     

    另一个客户端再执行update,就会之一在等待状态,直到前一个客户端的update提交才停止等待:

     要是不想等待就用 nowait,如果数据被锁定会给报错:

     解锁:

    select * from v$lock;

     不难发现sid为9的session的type为TM和TX,所以把sid为9的session在v$session中对应的记录kill

    select sid,serial# from v$session where sid=9

    alter system kill session '9,627';

    这时候sid为9的session想提交的话会报错:

    死锁问题:

    oracle会自动解决死锁,如

    A用户:update a set id = 1000 where id=100;

    B用户:update a set id = 2000 where id=200;

    这两条记录都还没有提交,接着A用户又想修改id=200的记录,同时B用户想修改id=100的记录:

    A用户:update a set id = 20 where id=200;

    B用户:update a set id= 10 where id=100;

    这样会造成死锁,这时oracle会自动检测到死锁并解决死锁。要注意执行的顺序才能看到效果。

  • 相关阅读:
    es6 --- var const let
    HTTP -- 请求/响应 结构
    点击下载文件
    计算机当前时间
    js -- img 随着鼠标滚轮的变化变化
    vue --- 全局守卫
    vue -- 路由懒加载
    vuex -- 状态管理
    js对数组进行操作
    高性能网站建设
  • 原文地址:https://www.cnblogs.com/sigm/p/6608112.html
Copyright © 2020-2023  润新知