• 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;
    
  • 相关阅读:
    入门练习
    课堂作业补充
    例题作业(9.1-9.7)
    stream — 创建stream(一)
    Lambda表达式的四大内置核心函数式接口
    lambda表达式基础语法及其使用
    java 按照固定大小分割 list 集合的几种方式
    分布式锁相关解决方案
    zabbix3.0 使用详解
    eclipse Memory Analyzer (mat) 安装及使用
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12771786.html
Copyright © 2020-2023  润新知