MySQL --- 19♪ 进阶15 TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读

本文介绍了MySQL中的TCL事务控制语言,包括如何开始和结束事务,设置断点,以及四种事务隔离级别及其避免的问题:脏读、幻读和不可重复读。还展示了在MySQL中如何查看和设置事务隔离级别,并通过实例演示了事务在转账操作中的应用,以及SAVEPOINT和ROLLBACK TO的使用。
摘要由CSDN通过智能技术生成

#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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值