一、事务
1、事务四大特性(ACID)
- 原子性(Atomicity):一个事务中的所有操作,要么都完成,要么都不执行。对于一个事务来说,不可能只执行其中的一部分。
- 一致性(Consistency):数据库总是从一个一致性的状态转换到另外一个一致性状态,事务前后数据的完整性必须保持一致。。
- 隔离性(Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的,多个事务之间的操作相互不影响。
- 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
2、隔离级别
(1)、Read Uncommitted(读取未提交内容):一个事务可以看到其他事务已执行但是未提交的结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少,并且存在脏读问题。
(2)、Read Committed(读取提交内容):一个事务只能看到其他事务已执行并已提交的结果(Oracle、SQL Server默认隔离级别)。这种隔离级别支持不可重复读,因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
(3)、Repeatable Read(可重读):同一事务的多个实例在并发读取数据时,会看到同样的数据行(MySQL的默认事务隔离级别)。存在幻读问题,InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
(4)、Serializable(可串行化):最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据就是脏数据
- 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
- 幻读:A事务在执行过程中,B事务插入了符合A事务查询条件的数据,导致A事务两次读取的数据不一致。
不可重复读和幻读的区别:
不可重复读是由update引起的,需要用锁行来避免;幻读是由insert或delete引起的,需要用锁表来避免。
√:可能出现 ×:不会出现
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
(5)、注:每降低一个事务隔离级别都能提高数据库的并发
①、读未提交:其它事务未提交就可以读
②、读已提交:其它事务只有提交了才能读
③、可重复读:只管自己启动事务时候的状态,不受其它事务的影响(mysql默认)
④、事务串行:按照顺序提交事务保证了数据的安全性,但无法实现并发