zoukankan      html  css  js  c++  java
  • mySQL__TCL课堂笔记和练习

    TCL

    /*
    Trnsaction Control Language 事物控制语言
    
    事物:
    一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
    
    
    事物的特性:
    ACID
    原子性:一个事物不可再分割,要么都执行,要么都不执行
    一致性:一个事物执行会使数据从一个状态切换到另一个一致状态
    隔离性:一个事物的执行不受其他事物的干扰
    持久性:一个事物一旦提交,会永久改变数据库的数据
    
    
    事物的创建
    (1)隐式事物:事物没有明显的开启和结束标记(insert,update,delete语句等)
    说明:自动提交功能默认是打开的
    	
    (2)显示事物:事物具有明显的开启和结束标记
    前提:必须先设置自动提交功能为禁用
    语法:
    步骤1:开启事物
    set autocommit=0;
    start transaction;可选
    步骤2:编写事物中的sql语句(select insert update delete)注意DDL语言中的create alter drop没有事物的概念
    语句1;
    语句2;
    ...
    步骤3:结束事物
    commit;提交事物
    rollback;回滚事物
    	
    */
    
    #自动提交功能默认是打开的
    SHOW VARIABLES LIKE 'autocommit';#ON
    
    #关闭自动提交功能(仅仅对当前的事物生效,不是永久有效)
    SET autocommit=0;
    
    #自动提交功能已经关闭
    SHOW VARIABLES LIKE 'autocommit';#OFF
    
    
    
    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=500 WHERE username='张无忌';
    UPDATE account SET balance=1500 WHERE username='赵敏';
    #结束事物1
    COMMIT;
    SELECT * FROM account;#500 1500
    
    
    
    #开启事物
    SET autocommit=0;
    START TRANSACTION;
    #编写一组事物的语句
    UPDATE account SET balance=1000 WHERE username='张无忌';
    UPDATE account SET balance=1000 WHERE username='赵敏';
    #结束事物2
    ROLLBACK;
    SELECT * FROM account;#500 1500
    
    #2.介绍delete和truncate在事物中的区别
    #delete可以成功回滚
    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM account;
    ROLLBACK;
    
    SELECT * FROM account;#记录还有
    
    
    #truncate
    SET autocommit=0;
    START TRANSACTION;
    TRUNCATE TABLE account;
    ROLLBACK;
    
    SELECT * FROM account;#没有记录了
    
    /*
    【问题】
    同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致一下各种并发问题:
    
    脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还【没有被提交】的字段. 之后, 若 T2 【回滚】, T1读取的内容就是临时且无效的.
    
    不可重复读: 同一个事务中,多次读取到的数据【不一致】
    
    幻读: 一个事务读取数据时,另外一个事务进行【更新(一般是插入和删除)】,导致第一个事务读取到了没有更新的数据
    
    【避免】
    通过设置事务的隔离级别(由低到高)
    1、READ UNCOMMITTED隔离级别最低,啥都避免不了避免
    2、READ COMMITTED 可以避免脏读
    3、REPEATABLE READ(默认) 可以避免脏读、不可重复读和一部分幻读
    4、SERIALIZABLE可以避免脏读、不可重复读和幻读
    */
    
    

    尝试READ UNCOMMITTED隔离级别(左图为第一个事物,右图为第二个事物):

    尝试READ COMMITTED隔离级别(左图为第一个事物,右图为第二个事物):

    尝试REPEATABLE READ隔离级别(左图为第一个事物,右图为第二个事物):


    尝试SERIALIZABLE隔离级别(左图为第一个事物,右图为第二个事物):

    /*
    savepoint 设置保存点
    仅仅搭配rollback使用
    */
    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM account WHERE id=1;
    SAVEPOINT a;#设置保存点
    DELETE FROM account WHERE id=2;
    ROLLBACK TO a;#回滚到保存点处,也就是删除第一行,不删除第二行
    
    
    SELECT * FROM account;
    
  • 相关阅读:
    Android学习笔记之-----讯飞语音识别实例化RecognizerDialog参数出现错误的解决方法
    java基本数据类型取值范围
    中国教育
    git push --help
    cherry Tree的严重漏洞
    程序的核心是什么
    BeanUtils.getProperty性能分析
    Java各种反射性能对比
    Spring AOP无法拦截Controller中的方法
    Mock单元测试
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12771786.html
Copyright © 2011-2022 走看看