Mysql事务

数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,事务是一组不可再分割的操作集合(工作逻辑单元)

mysql中如何开启事务:

1
2
3
begin / start transaction			-- 手工
commit / rollback -- 事务提交或回滚
set session autocommit = on/off; -- 设定事务是否自动开启

事务ACID特性

  • 原子性(Atomicity)

    最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚

  • 一致性(Consistency)

    事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致

  • 隔离性(Isolation)

    一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)

  • 持久性(Durability)

    事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失

事务并发带来的问题

脏读:

不可重复读:

幻读:

事务隔离级别

SQL92 ANSI/ISO标准:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

隔离级别 解决问题 说明
Read Uncommitted(未提交读) 未解决并发问题 事务未提交对其他事务也是可见的,产生脏读
Read Committed(提交读) 脏读 一个事务开始之后,只能看到自己提交的事务所做的修改,产生不可重复读
Repeatable Read(可重复读) 不可重复读 在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题
Serializable(串行化) ALL 最高的隔离级别,通过强制事务的串行执行

InnoDB对事物隔离级别的支持

隔离级别 脏读 不可重复读 幻读
Read Uncommitted(未提交读) 可能 可能 可能
Read Committed(提交读) 不可能 可能 可能
Repeatable Read(可重复读) 不可能 不可能 对InnoDB不可能
Serializable(串行化) 不可能 不可能 不可能

在 InnoDB 引擎中,默认隔离级别是Repeatable Read(可重复读),也可以防止幻读

隔离级别到底是如何实现的?

锁、MVVC