SQL笔记06

  • 多条语句作为一个整体进行操作, 称为事务

  • 数据库事务确保该范围内的所有的操作都可以全部成功, 或者全部失败.

  • 如果事务失败, 那么执行效果和没有执行这些SQL一样, 不会对数据库有任何改动

  • 数据库事务具有ACID四个特性:

    • A: atomic, 原子性, 将sql作为原子工作单元执行, 要么全部执行, 要么不执行
    • C: consistent, 一致性, 事务完成后所有状态都是一致的, A账户只要减去了100, B账户一定会加上100
    • I: Isolation, 隔离性, 如果有多个事务并发执行, 每个事务作出的修改必须与其他事务隔离
    • D: Duration, 持久性, 事务完成后, 对数据库的修改持久话存储
  • 单条sql: 数据库自动将其作为一个事务执行, 这种事务被称为隐式事务

  • 多条sql语句作为一个事务执行, BEGIN开启事务, COMMIT提交事务, 显式事务

  • COMMIT: 提交事务, 即试图把事务内的所有sql所做的修改永久保存, 如果COMMIT失败了, 所有的sql都会失败

  • ROLLBACK: 回滚事务, 主动让事务失败, 整个事务都会失败

隔离级别

  • 如果涉及同一条记录的时候, 并发操作可能会发生问题, 引起数据不一致性问题
  • 比如: 赃读, 不可重复读, 幻读等
  • 四种隔离级别, 对应可能出现的数据不一致情况
    • Isolation Level, Dirty Read, No Repeatable Read, Phantom Read
    • Read Uncommitted, yes, yes, yes
    • Read Committed, -, yes, yes
    • Serializable, -, -, -

Read Uncommitted

  • 隔离级别最低的事务
  • 一个事务可以读到另一个事务更新后, 但未提交的数据.
  • 脏读: 如果另一个事物回滚, 当前事务读到的就是脏数据.
# 客户端A

mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE teacher SET name='Bob' WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
# 客户端B

mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

# 此条数据为脏数据
mysql> SELECT * FROM teacher WHERE id=1;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM teacher WHERE id=1;
+----+-------+
| id | name  |
+----+-------+
|  1 | Alice |
+----+-------+
1 row in set (0.00 sec)

mysql> COMMIT;

Read Committed

  • 在此级别的隔离程度下, 一个事务, 可能会遇到 不可重复读 问题 (Non Repeatable Read)
  • 不可重复读: 在一个事务内, 多次读同一数据, 在这个事务还没有结束时, 如果另一个事务恰好修改了这个数据, 那么第一个事务中读到的数据就可能不一致
  • 只能在第一次执行时, 成功复现

Repeatable Read

  • 此隔离级别下, 可能出现幻读的情况
  • 幻读: 在一个事务中, 第一次读取这个事务不存在, 当试图更新这条数据的时候, 能成功. 并再次查询能够查询到

Serializable

  • 最高规格的隔离,所有的事务依次进行
  • 不可能出现脏读, 不可重复读, 幻读
  • 事务具有最高的安全性, 但是事务是串行的, 效率会大大下降

默认隔离级别

  • 没有指定隔离级别, mysql会使用默认隔离级别
  • MySQL中, 如果使用的是InnoDB, 默认的隔离级别是REPEATABLE READ
原文地址:https://www.cnblogs.com/zhangrunhao/p/13198208.html