zoukankan      html  css  js  c++  java
  • MySQL进阶15--TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读

    #TCL事物控制语言 : 
    /*
      Transaction control language : 事物控制语言
      事务:
        一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行;
        事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的;
      处理事务的关键字:
        建立事务:
            SET autocommit=0; 
            START TRANSACTION;
        结束事务:
            commit;
            #rollback; #回滚
        设置断点:
            SAVEPOINT a; #设置一个回滚点
            ROLLBACK TO a; #回滚到保存点a    
    -----------------------
    事务的隔离级别中出现的异常:
        脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 
            之后, 若 T2 回滚, T1读取的内容就是临时且无效的.  
        不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 
            之后, T1再次读取同一个字段, 值就不同了.  
        幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插 入了一些新的行. 
            之后, 如果 T1 再次读取同一个表, 就会多出几行. 
       ---------------------------
               (回滚无效)脏读    幻读   不可重复读
       read uncommited :  √        √         √
       read commited   :   ×       √         √
       repeatable read :   ×        x        √
       serializable    :   x        x         x
       --------------------------
           Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 
           Oracle 默认的事务隔离级别为: READ COMMITED  
           Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别 为: REPEATABLE READ ;
      ----------------------------
       查看隔离级别:  (未能实现,找不到该命令!!)
        select @@tx_isolation;
       设置隔离级别:
        set session/global(全库) transaction isolation level 隔离级别;
       
    */
        #1、通过show engines;来查看mysql支持的存储引擎。 
    SHOW ENGINES;  #Engine    Support      Comment                                              Transactions    XA    Savepoints
               #InnoDB    DEFAULT      Supports transactions, row-level locking, and foreign keys    YES    YES    YES
    
    #2/演示事务的使用步骤:转账
        #(1)建立表
    CREATE DATABASE test;
    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);
        #(2)开启事务,编写一组事务的语句,结束事务COMMIT(提交) 
    SET autocommit=0;
    START TRANSACTION;
    
    UPDATE    account SET balance =500 WHERE username='张无忌';
    UPDATE    account SET balance =1500 WHERE username='赵敏';
    
    COMMIT;
    SELECT * FROM account;
    #---------------------------------
        #: 或者使用#rollback 进行回滚,滚回更新前的结果
    SET autocommit=0;
    START TRANSACTION;
    UPDATE    account SET balance =1000 WHERE username='张无忌';
    UPDATE    account SET balance =1000 WHERE username='赵敏';
    
    ROLLBACK;
    SELECT * FROM account;
    
        #命令行下设置事务最低的隔离级别 : read uncommitted
     SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
     # 结果:   Query OK, 0 rows affected (0.00 sec)
    #---------------------------
        #2.演示事务对delete 和 truncate 的处理的区别
    SET autocommit=0;
    START TRANSACTION;
    
    DELETE FROM account;
    #truncate from account; # 事务不支持这种删除!
    ROLLBACK;
    
    SELECT * FROM account;    
    
    INSERT INTO account VALUES(25,'qwq',111),(26,'aaa',222);    
        #3:演示savapoint(保存点) 的使用
    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM account WHERE id=25;
    SAVEPOINT a; #设置一个回滚点
    DELETE FROM account WHERE id=25;    
    ROLLBACK TO a; #回滚到保存点a    
    
    SELECT * FROM account;
        
    
    
        
        
  • 相关阅读:
    多进程乱语
    python常用函数拾零
    Flutter 安装vscode
    Flutter 安装android studio
    vsCode设置
    android ViewPager
    Android shape
    android Intent
    java 集合
    java 泛型
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9877806.html
Copyright © 2011-2022 走看看