7.1 概述

事务的含义:一条或多条SQL语句组成执行单元,这一组SQL要么都执行,要么都不执行

事务的特点:

  1. 原子性:一个事务是不可再分割的整体,要么都执行,要么都不执行
  2. 一致性:一个事务可以使数据从一个一致状态切换到另一个一致状态
  3. 隔离性:一个事务不受其他事务的干扰和影响,多个事务是相互隔离的
  4. 持久性:一个事务一旦提交,则永久的持久化到本地

7.2 事务的使用步骤

  1. 开启事务
  1. set autocommit = 0;
  2. start transaction; # 可以不写
  1. 编写一组逻辑SQL语句
  2. 结束事务

如何设置回滚点:

在逻辑SQL语句中设置回滚点,savepoint 回滚点名
然后 rollback 回滚点名 就可以回滚到指定回滚点

7.3 事务的并发问题

  1. 事务的并发是如何发生的?

多个事务同时操作同一个数据库的同一个数据的时候,就会发生并发

  1. 并发问题有哪些?
    • 脏读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“更新的数据”
    • 不可重复读:一个事务多次读取同一数据,结果不一样
    • 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入的数据”
  2. 如何解决并发问题?

通过设置隔离级别来解决这些并发问题

  1. 隔离级别有哪些?
    • read uncommitted:读未提交
    • read committed:读已提交
    • repeatable:可重复读
    • serializable:串行化

各个隔离级别能解决的问题:

隔离级别 脏读 不可重复读 幻读
read uncommitted:读未提交 不能解决 不能解决 不能解决
read committed:读已提交 可以解决 不能解决 不能解决
repeatable:可重复读 可以解决 可以解决 可以解决
serializable:串行化 可以解决 可以解决 可以解决

7.4 设置隔离级别

每启动一个 mysql 程序, 就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别
Mysql 支持 4 种事务隔离级别。 Mysql 默认的事务隔离级别为: REPEATABLE READ。在mysql中REPEATABLE READ的隔离级别也可以避免幻读了。
查看当前的隔离级别:SELECT @@tx_isolation;
查看全局的隔离级别:SELECT @@global.tx_isolation;

设置当前MySQL连接的隔离级别,语句如下:

  1. set tx_isolation ='隔离级别';

设置数据库系统的全局隔离级别,语句如下:

  1. set global tx_isolation ='隔离级别';