avatar

目录
关于数据库事务的一些总结

该篇是关于数据库事务方面的一部分总结笔记.

1. 什么是事务

事务,英文 Transaction. 是指一组在数据库中的操作,通常指代任何会引起数据库内部变化的操作。

维基百科上原话是:

A database transaction symbolizes a unit of work performed within a database management system (or similar system) against a database, and treated in a coherent and reliable way independent of other transactions. A transaction generally represents any change in a database.

2. 事务的特性

通常来说,事务都包含以下四个特点,原子性(Atomic), 一致性(Consistent), 隔离性(Isolated), 持久性(Durable). 简称ACID.

  1. 原子性: 指数据库在执行一组事务的时候,这组事务组成了不可分割的工作单元。这一组事务要么全部成功要么全部失败,不允许一部分成功一部分失败。
  2. 一致性: 是指事务必须使数据库状态从一个一致性状态到达另一个一致性状态。呵呵,这是百科给出来的定义,太教科书化了,让人听完之后还是云里雾里的。看以下维基百科给出来的原文定义:

    Consistency ensures that a transaction can only bring the database from one valid state to another, maintaining database invariants: any data written to the database must be valid according to all defined rules, including constraints, cascades,triggers, and any combination thereof. This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct.

按照我的理解,一致性保证了数据库从一个有效状态迁移到另一个有效状态。举个栗子,你给一张表定义了一些列,同时规定了列的类型,并且给整张表还加了一些约束。如果想往这张表中插入数据,那么这些新数据会受到列名类型的约束,又或者是整张表的唯一性约束。这些约束最终能保证你插入的数据是合规的,保证了数据库内容更新之后依然处于一个有效的状态。

  1. 隔离性: 是指一个事务的执行不应该受到其他事务的影响和干扰。多个并发的事务,他们之间对数据库的修改应该是隔离的,当然了,隔离性会受到隔离级别的影响,下边会展开细说。
  2. 持久性: 这个是最好理解的了,就是说事务对于数据库的修改,在事务提交之后,将会是永久性的,不受接下来其他操作的影响。

3. 事务的隔离级别

事务有以下四个隔离级别.

  1. 读未提交 (read uncommitted), 指一个事务未提交的数据能被其他事务看见
  2. 读已提交 (read committed), 指一个事务只能读到别的事务已提交的事务
  3. 可重复读 (repeatable read), 是指一个事务执行过程中,该事务能看到的数据总是跟事务启动时能看到的数据保持一致
  4. 串行化 (serializable), 是指对于同一行记录,事务在读取和更新时分别会加上读锁和写锁,当发生读写冲突时,只有等待前一个事务执行完成后,后续的事务才能继续执行操作,因此这个隔离级别的并发效率是最低的。

下面再举个栗子说明一下.

事务A 事务B
begin select val=1 begin
—— select val=1
—— update val=2
select val as v1 ——
—— commit
select val as v2 ——
commit ——
select val as v3 ——

对于读未提交,事务A看到的v1,v2和v3的值都是2

对于读已提交,事务A看到的v1值为1,v2和v3的值为2

对于可重复读,事务A看到的v1和v2都是1,由于事务B的修改,事务A看到的v3值是2

对于串行化,事务B在执行update时会被加上写锁。由于事务A和B都是在操作val, 因此会发生读写冲突。又由于事务A在事务B之前,所以事务B必须等待事务A提交后才能继续往下执行。事务A看到的v1和v2值均为1,看到的v3值为2.


本文参考内容出处:

  1. 维基百科
  2. 《极客时间MySQL 45讲 – 林晓斌》
文章作者: JanGin
文章链接: http://jangin.github.io/2020/07/25/notes-of-database-transaction/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JanGin's BLOG

评论