在mysql中,事务是在存储引擎层实现的。事务保证一组数据库操作,要么全部成功,要么全部失败。
myisam引擎不支持事务。
事务的特性

  • 原子性: 指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 隔离性 指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图进行修改的事务看到。
  • 一致性 指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 持久性 指在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化的保存在数据库中。

    隔离性与隔离级别

    当数据库有多个事务同时执行时,会出现脏读、不可重复读、幻读的问题。隔离级别可以用来解决这些问题。

  • 隔离级别<读未提交、读提交、可重复读、串行化>

    • 读未提交: 指当一个事务还未提交的时候,它做的变更就可以被别的事务看到。
    • 读提交: 当一个事务提交了以后,它做的变更才会被别的事务看到。
    • 可重复读: 指一个事物执行过程中,可看到的数据总是跟这个事务启动时看到的数据是一致的。当然在可重复读的级别下,未提交的变更对其他事务是不可见的。
    • 串行化: 对于同一行记录,’写’会加’写锁’,’读’会加’读锁’。当出现读写锁冲突的时候,后访问的事务必须要等先访问的事务完成,才能继续执行。
      • 案例
  • image.png

    • 不同隔离级别下,事务A返回的结果
      • 读未提交:V1的值为2,这时虽然事务B还没有提交,但是结果已经被事务A可以看到,V2 V3的值都是2。
      • 读提交: V1的值为1,V2的值是2,事务B的更新在提交后才能被A看到。所以V3的值也是2。
      • 可重复读: V1、V2的值是1,V3是2。之所以V2还是1,遵循的是:事务在执行期间前后看到的数据是一致的。
      • 串行化:事务B在将1改为2的时候,会被锁住.直到事务A提交后,事务B才可以继续执行,从事务A的角度来看,V1、V2的值是1,V3的值是2。

        事务隔离的实现

  • image.png

  • mysql每条记录在更新的时候都会记录一条更新操作,记录上的最新值,可以根据回滚操作,都可以得到前一个状态的值。