• mysql数据库基础:TCL事务控制语言


    事务

    1、简介

    一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

    整个单独单元作为一个不可分割的整体,如果单元中某条sql语句一旦执行失败或产生错误,整个单元将会回滚
    所有受到影响的数据将会返回到事务开始以前的状态;
    如果单元中的所有sql语句均执行成功,则事务被顺利执行

    回滚:简单来说就是撤销操作

    2、事务的ACID属性*

    1、原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

    2、一致性(Consistency)
    一致性是指事务必须使数据库从一个一致性状态变化到另一个一致性状态

    3、隔离性(Isolation)
    事务的隔离性是指一个事务的执行不能被其他事务干扰,及一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰

    4、持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

    3、事务的创建

    隐式事务:事务没有明显的开启和结束的标记。比如:insert、update、delete语句

    显示事务:事务具有明显的开启和结束的标记。使用前提:必须先设置自动提交功能为禁用(set autocommit=0;)

    使用步骤:
    1、开启事务:

    # 设置自动提交功能为禁用
    set autocommit=0;
    # 开启事务,在使用了上面一个语句的情况下可省略
    start transaction; # 可选
    
    • 1
    • 2
    • 3
    • 4

    2、编写事务中的sql语句(select、insert、update、delete)

    3、结束事务

    commit; # 提交
    
    rollback; # 回滚
    
    • 1
    • 2
    • 3

    4、并发问题

    4.1 描述

    对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

    (1)脏读:对于两个事务T1,T2,T1读取了已经被T2
    更新但还没有被提交的字段之后,若T2回滚,则T1读取的内容就是临时且无效的。

    (2)不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,读到的值就不同了。

    (3)幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读取了同一个表,就会多出几行。

    4.2 设置隔离级别解决并发问题

    通过设置隔离级别来组织并发问题的产生。
    隔离级别:一个事务与其他事务隔离的程度称为隔离级别,不同隔离级别应对不同的干扰强度,隔离级别越高,数据一致性就越好,但并发性越弱。

    数据库提供的四种事务隔离级别
    (1)READ UNCOMMITTED(读未提交数据)
    允许事务读取未被其他事务提交的变更。脏读、不可重复读和幻读的问题都会出现。

    (2)READ COMMITTED(读已提交数据)
    只允许事务读取已经被其他事务提交的变更。可以避免脏读,但不可重复度和幻读问题仍可能出现。

    (3)REPEATABLE READ(可重复读)
    确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复度,但不可解决幻读的问题。

    (4)SERIALIZABLE(串行化)
    确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都能避免,但性能十分低下。

    oracle数据库支持的2中事务隔离级别:READ COMMITED,SERIAlIZABLE。默认为READCOMMITED


    mysql数据库支持四种隔离级别,默认为REPEATABLE READ

    4.3 设置隔离级别

    • 查看当前隔离级别
    select @@transaction_isolation;
    
    • 1
    • 修改隔离级别

    设置当前mysql连接的隔离级别

    # 将隔离级别修改为read uncommitted级别
    set session transaction isolation level read uncommitted;
    
    • 1
    • 2

    设置数据库系统的全局的隔离级别

    set global transaction isolation level read  committed;
    
    • 1

    5、回滚

    使用savepoint设置回滚点

    set autocommit = 0;
    start transaction;
    delete from account where id = 25;
    savepoint a; # 设置保存点
    delete from account where id = 28;
    rollback to a; # 回滚到保存点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行rollback to a这句后,会自动撤销指定回滚点后面所执行的操作

    6、在事务中使用delete和truncate的区别

    delete支持回滚,truncate不支持回滚

  • 相关阅读:
    云原生下GIS服务规划与设计
    NC9 二叉树中和为某一值的路径(一)
    70B大模型训练秘方① :数据集创建与评估
    Elasticsearch开启用户验证
    SEO推广-SEO推广软件-SEO推广工具
    Mybatis入门-初步环境搭建
    HTTP文件服务
    《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网
    前端小技巧: 拍平数组的6种常见方法
    R语言贝叶斯METROPOLIS-HASTINGS GIBBS 吉布斯采样器估计变点指数分布分析泊松过程车站等待时间...
  • 原文地址:https://blog.csdn.net/lalala_dxf/article/details/125523082