《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·006【事务】

一、事务

1、事务介绍

事务,也称工作单元,是由一个或多个SQL语句所组成的操作序列。

这些SQL语句作为一个完整的工作单元,要么全部成功,要么全部失败

通过事务来保证数据的一致性。


就比如说转账,A转给了B一共100元,那么A就要减少100元,B就要增加100元。

也就是说下面两条SQL语句要么全部成功,要么全部失败,不能存在中间状态。

update A set s = s-100;
update B set s = s+100;

事务有以下特点:

  • 原子性
    事务要么全部成功,要么全部失败。
  • 一致性
    一旦事务完成(不论成功还是失败),整个系统处于数据一致的状态。
  • 隔离性
    一个事务的执行不会被另一个事务所干扰。
    比如两个人同时从一个账户取钱,应当保证余额正确。
  • 永久性
    事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

2、事务组成

一个事务可以由以下任意一种形式组成:

  • 一组相关的DML、DQL语句,再加上一个TPL语句(commitrollback
  • 一组相关的DML、DQL语句,再加上一个DDL语句(createalterdroptruncate……)
  • 一组相关的DML、DQL语句,再加上一个DCL语句(grantrevoke

3、事务结束

显式结束

  • TPL语句
    commit——提交
    rollback——回滚

隐式结束

  • 隐式提交
    DDL语句——createalterdroptruncaterename
    DCL语句——grantrevoke
  • 隐式回滚
    客户端强制关闭
    客户端连接异常
    系统崩溃

4、MySQL事务处理

方法一:通过beginrollbackcommit来实现

  • beigin——开始一个事务
  • rollback——事务回滚
  • commit——事务提交

方法二:直接set改变MySQL的自动提交样式

MySQL默认自动提交,也就是提交一个SQL就直接执行。

  • set autocommit = 0——禁止自动提交
  • set autocommit = 1——开启自动提交

set autocommit = 0之后,所有的SQL语句都将作为事务处理,直到用commit/rollback结束

注:MySQL只有InnoDB引擎支持事务。

5、保存点与回档

想要回滚到指定位置,而不是回滚到事务的起点,可以通过savepoint来实现

savepoint 保存点名;  -- 定义一个保存点
rollback to 保存点名;  -- 回滚到指定保存点

注:savepointrollback两个语句都不会结束事务的执行

6、事务隔离级别

隔离级别 英文 备注
读未提交 read uncommitted 一般不用,没有隔离,存在“脏读”问题
读提交 read committed Oracle默认
解决了“脏读”问题
存在着“幻读”问题
可重复读 repeatable read MySQL默认
同时解决了脏读和幻读
串行化 serializable 用得很少,并发性差

可以通过以下SQL语句来查看MySQL当前会话的事务隔离级别

select @@tx_isolation;

MySQL可重复读举例
在这里插入图片描述
虽然网上总是流传着事务隔离级别为“可重复读”的时候会同样存在着“幻读”的问题,但是也有说法指出,MySQL的InnoDB引擎实现的“可重复读”通过mvcc机制避免了这种幻读现象。从上面的例子来看,后者的说法应该更为准确一些。

7、脏读、不可重复读、幻读

可以参考这位博主的见解——https://www.cnblogs.com/yubaolee/p/10398633.html


脏读

脏读就是指,当事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,事务B也访问这个数据,然后使用了这个数据。

因为这个数据是还没有提交的数据,那么事务B读到的这个数据是脏数据。

依据脏数据所做的操作可能是不正确的。


不可重复读

不可重复读可以理解为,当事务A第一次查询某个表T的某个记录,得到一个记录R1,然后事务B对刚刚查询的同一条记录进行了更新,再然后事务A第二次进行了同样的查询,得到了一个记录R2,发现R2与R1不同。

在这种情况下,如果事务A和事务B对同一条记录进行了更新,后完成的事务会造成先完成的事务的丢失。


幻读

幻读可以理解为,当事务A第一次查询某个表T,得到了一个结果集S1,然后事务B对表T增加/删除/修改了某个/某些数据,再然后事务A第二次进行了同样的查询,得到了一个结果集S2,发现S2与S1不同。

虽然看上去和不可重复读差不多,但是幻读强调结果集合的增减,不单单只是一条记录。

发布了49 篇原创文章 · 获赞 9 · 访问量 3121

猜你喜欢

转载自blog.csdn.net/qq_44220418/article/details/105041205
006