zoukankan      html  css  js  c++  java
  • Oracle DTL 数据事务语言

    DTL 数据事务语言

    事务的定义:
    就是指一组相关的SQL操作,我们所有的操作都是事务中的。

    注意:在数据库中,执行业务的基本单位是【事务】,不是以某一条SQL。
    数据库在默认情况下,事务是都打开的,也就是说它一种处在事务当中的,一个事务的结束,代表着下一个事务的开启。
    执行commit或者rollback指令时,会结束当前事务

    作用:用来保证数据的平稳性和可预测性
    例如:银行转账业务
    【SQL1:A账号向B账号转账10000
    update tbl_account set balance=balance-10000 where accountNo=A账号;
    SQL2:
    update tbl_account set balance=balance+10000 where accountNo=B账号;
    SQL1和SQL2必须处在同一个事务中,从而保证同时成功或者同时失败。】

    事务的四大特性(ACID):


      atomic,原子性,事务是不可分割的,要么同时成功,要么同时失败;
      consistency,一致性,事务一旦结束,内存中的数据和数据库中的数据是保持一致;
      isolation,隔离性,事务之间互不干扰,一个事务的结束意味着下一个事务的开启;
      duration,持久性,事务一旦提交,则数据持久化到数据库中,永久保存

      在oracle中,操作事务的命令:
      1.commit,提交事务
      把事务中所有的数据持久化到磁盘中

      2.rollback to 回滚点,回滚事务
      把事务中所做的操作全部取消,回到初始化状态

      3.savepoint 回滚点,设置回滚点
      事务回滚时,回滚到起点

      总结:
      1.目前主流的数据库都是支持事务的,而且其中Oracle支持的最好
      2.一个事务不能读取到另一个事务还没有提交的数据
      3.DDL语句都会自动提交事务
      4.DML语句不会自动提交事务,需要手动提交commit

    多事务的并发处理机制:
    原因:多个事务同时操作一个表中的同一行数据,如果这些操作同时修改的话,就会产生并发问题,如果不处理,则会造成数据的不一致的情况

    数据库可能产生的并发问题包括:
    1.脏读
    是指一个事务正在访问数据,并且对这个数据进行修改,而这种修改还没有提交到数据库中,而另一个事务也访问了这个数据,并且使用了这个数据。
    解决方法:一个事务在修改数据时,该数据不能被其他事务访问

    2.不可重复读
    是指一个事务多次读取同一条记录,如果此时另一个事务也访问并且修改了该数据,则就会出现多次读取出现数据不一致的情况,原来的数据变成了不可重复读取的数据。
    解决方法:只有在修改事务完全提交过后才可以读取数据

    3.幻读
    是指一个事务修改表中的多行记录,但是此时另一个事务对该表格进行了插入数据的操作,则第一个事务会发现表格中会出现没有被修改的行,就像发生了幻象一样;
    解决方法:在一个事务提交数据之前,其他事务不能添加数据

    【Oracle中采用‘锁’来做并发处理】
    1.表级排它锁(X) exclusive mode
    2.表级共享锁(S) share mode
    3.表中行级排它锁 share row exclusive
    注:这三种锁是通过专门的命令来申请的

    语法:
    lock table tbl_name in mode;

    例如:
    --以共享锁锁表
    lock table tbl_emp in share mode;

    --以排它锁锁表
    lock table tbl_emp in exlusive mdoe;

     4.行级共享锁(RS) row share

    5.行级排它锁(RX) row exclusive
    注:这两种锁无需通过专门的命令申请,而是通过DQL和DML来自动申请的

    注意:
    1.所有的DQL语句默认情况下都会自动申请RS锁
    2.所有的DML语句默认情况下都会自动申请RX锁,每一行记录都有唯一的RX锁
    3.在项目中,为了满足业务要求,一般select语句需要申请RX锁

    select语句通过for update来申请RX锁:
    select * from s_emp for update;
    select * from s_emp for update wait 5;等待5秒
    select * from s_emp for update nowait;

  • 相关阅读:
    Avoiding React setState() Pitfalls(译)
    rax学习(十):实现微信消息长列表(LongList)之列表扩展
    rax学习(九):实现微信消息长列表(LongList)之配置透出
    rax学习(八):实现微信消息长列表(LongList)之性能优化
    rax学习(七):实现微信消息长列表(LongList)之性能监控
    rax学习(六):实现微信消息长列表(LongList)之业务埋点
    jQuery获取父 兄 子 节点
    css相关
    两端对齐justify
    js页面刷新的几种方法
  • 原文地址:https://www.cnblogs.com/ty-v/p/7880497.html
Copyright © 2011-2022 走看看