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;
    


    
    

猜你喜欢

转载自www.cnblogs.com/zhazhaacmer/p/9877806.html