与事务相关的一些概念

事务实际上是一组DML(insert\update\delete) 语句的集合。

事务的ACID特性

  • 原子性(Atomicty):在一个事务中,一组DML语句操作要么全部成功,要么全部失败,不会出现部分成功部分失败的现象。
  • 一致性(Consistency):一致性指的是数据库的数据在事务操作前后都必须满足业务约束条件。
  • 隔离性(Isolation):隔离性是指数据库允许多个并发事务同时对数据库进行读写和修改的能力,隔离性可以防止多个并发事务并发执行时由于交叉执行而导致的数据不一致。
  • 持久性(Durability):事务结束后对数据的修改是永久的,即使系统发生故障也不会丢失。


事务语句

  • 事务开启语句是begin或者start transaction(read write| readonly)命令开始的,或者把事务的自动提交特性关闭(set autocommit = 0).事务的结束通常使用commit或者rollback显式结束。commit表示提交事务,使得已对数据库做的所有修改成为永久性。rollback表示回滚事务,撤销正在进行的所有未提交的修改。
  • 事务除了显式的提交(commit)和回滚(rollback)外,还有隐式的提交(commit)和回滚(rollback)。隐式提交可以是DDL语句和再次的begin或start transaction指令,隐式回滚可以是退出回话、连接超时或者关机等。

事务隔离级别

  • 读未提交(Read uncommitted),简称RU,在其中一个事务中,可以读取到其他事务未提交的数据变化。这种读取到其他事务还未提交的事务,叫做脏读现象。
  • 读已提交(read commted),简称RC,在其中一个事务中,可以读取到其他事务已经提交的数据变化。这种读取也叫作不可重复读,允许幻读现象,是Oracle数据库的默认隔离级别。
  • 可重复读(repetable read),简称RR,是MySQL默认的事务隔离级别,在其中一个事务中,直到事务结束前,都可以反复读取到事务刚开始时读到的数据,并一直不会发生变化,避免了脏读,不可重复读,幻读现象的发生。
  • 串行化(serializable),在每个读取的数据行上都需要加上表级共享锁,在每次写操作时都需要加上表级排它锁。这会造成Innodb的并发能力下降,大量的超时和锁竞争的发生。

脏读、不可重复读、幻读和可重复读现象

  • 脏读:脏读是在RU级别中发生的现象,指 的是一个事务读取到了其他事务未提交的数据。
  • 不可重复读:指的是在一个事务中读取到了其他事务针对旧数据的修改记录(常见的操作是update或者delete语句)。
  • 幻读:指的是在一个事务中读取到了其他事务新增的数据,仿佛出现了幻影现象(常见的操作就是insert语句)。这种话现象允许出现在RC的事务隔离级别中。
  • 可重复读:假设在事务A中一开始读取到三行数据,在事务A还未结束时,事务B在满足事务A查询条件的情形下向数据库中添加了新的数据并做了提交,此时事务A以相同的条件再次查询,得到的数据还是事务A开始时得到的数据,并没有读到事务B新增的数据。可重复读是MySQL默认的事务隔离级别,他消除了脏读、不可重复读、幻读现象。很好的保证了事务的一致性。
posted @ 2019-09-18 11:27  穆默仙僧  阅读(201)  评论(0编辑  收藏  举报