数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,事务是一组不可再分割的操作集合(工作逻辑单元)
mysql中如何开启事务:
1 | begin / start transaction -- 手工 |
事务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