zoukankan      html  css  js  c++  java
  • TCL语言

    TCL语言-Transaction Control Language 事务控制语言

    • 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
    案例:转账
    
    张三丰  1000
    郭襄    1000
    
    updateset 张三丰的余额=500 where name='张三丰'
    意外
    updateset 郭襄的余额=1500 where name='郭襄'

    事务的特性(ACID)

    • 原子性:一个事务不可再分割,要么都执行要么都不执行
    • 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
    • 隔离性:一个事务的执行不受其他事务的干扰
    • 持久性:一个事务一旦提交,则会永久的改变数据库的数据.

    了解

    • 隐式(自动)事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如insertupdatedelete
    • 显式事务:事务具有明显的开启和结束的标记;前提:必须先设置自动提交功能为禁用

    具体步骤:

    步骤1:开启事务
    set autocommit=0;
    start transaction;可选的
    
    步骤2:编写事务中的sql语句(select insert update delete)
    语句1;
    语句2;
    ...
    
    步骤3:结束事务
    commit;提交事务
    rollback;回滚事务

    案例

    SHOW VARIABLES LIKE 'autocommit';
    SHOW ENGINES;
    
    #1.演示事务的使用步骤
    DROP TABLE IF EXISTS account;
    CREATE TABLE account(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(20),
        balance DOUBLE
    );
    INSERT INTO account(username,balance)
    VALUES('张无忌',1000),('赵敏',1000);
    
    #开启事务
    SET autocommit=0;
    START TRANSACTION;
    #编写一组事务的语句
    UPDATE account SET balance = 1000 WHERE username='张无忌';
    UPDATE account SET balance = 1000 WHERE username='赵敏';
    
    #结束事务
    ROLLBACK;
    #commit;
    
    SELECT * FROM account;

    并发事务

    1、事务的并发问题是如何发生的?

    • 多个事务同时操作 同一个数据库的相同数据时

     2、并发问题都有哪些?

    • 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
    • 脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务更新的数据;
    • 不可重复读:一个事务多次读取,结果不一样;
    • 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务插入的数据。

    3、如何解决并发问题?

    • 通过设置隔离级别来解决并发问题

    4、隔离级别

                                脏读           不可重复读         幻读
    read uncommitted:读未提交     ×                ×              ×        
    read committed:读已提交      √                ×              ×
    repeatable read:可重复读     √                √              ×
    serializable:串行化          √                √              √
    • Oracle 支持的2 种事务隔离级别:READ COMMITED, SERIALIZABLEOracle 默认的事务隔离级别为: READ COMMITED
    • Mysql 支持4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ

    注意:数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.

    一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

    案例

    1.查看隔离级别
    select @@tx_isolation;
    
    设置隔离级别
    set session|global transaction isolation level 隔离级别;
    
    #2.演示事务对于delete和truncate的处理的区别
    SET autocommit=0;
    START TRANSACTION;
    
    DELETE FROM account;
    ROLLBACK;
    
    #3.演示savepoint 的使用
    SET autocommit=0;
    
    START TRANSACTION;
    DELETE FROM account WHERE id=25;
    SAVEPOINT a;#设置保存点
    DELETE FROM account WHERE id=28;
    ROLLBACK TO a;#回滚到保存点
    
    SELECT * FROM account;

     

  • 相关阅读:
    Scripts.Render 索引超出了数组界限
    AutoFac使用方法总结
    MFC中打开一个获取路径的对话框
    MFC中自定义消息
    获得窗口句柄的方法
    App Doc View Frame中指针的获取
    MFC中菜单的命令响应顺序
    机械设计软件编写心得
    对SVD奇异值分解的理解
    安装win8+Ubuntu14.04双系统的经验总结
  • 原文地址:https://www.cnblogs.com/HelloM/p/14202177.html
Copyright © 2011-2022 走看看