事物的四大特性(ACID)
原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部失败;
一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
隔离性(Isolation): 并发访问数据库时,一个事务的成功或者失败对于其他的事务是没有影响,两个事务应该相互独立。
持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
什么是脏读?幻读?不可重复读?
脏读(Drity Read) : 当事务读取还未提交的数据时,就会发生这种事件。事务1已更新一份数据,事务2在此时读取了同一份数据,由于某些原因,前一个回滚(RollBack)了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read) : 同一事务中,前后多次读到的数据不一样。例如甲乙同时读取一行数据,然后甲修改或删除该行并提交修改操作,当乙试图重新读取该行时,它就会得到不同的数据值。
不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
幻读(Phantom Read): 和脏读类似,是针对于插入操作过程中的读取问题,在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
隔离级别
数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。
-
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更。
a) 存在:3个问题(脏读、不可重复读、虚读)。
b) 解决:0个问题 -
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据。
a) 存在:2个问题(不可重复读、虚读)。
b) 解决:1个问题(脏读) -
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。
a) 存在:1个问题(虚读)。
b) 解决:2个问题(脏读、不可重复读) -
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。
a) 存在:0个问题。
b) 解决:3个问题(脏读、不可重复读、虚读)
安全和性能对比
安全性: SERIALIZABLE > REPEATABLE-READ > READ-COMMITTED > READ-UNCOMMITTED
性能 (并发性): SERIALIZABLE < REPEATABLE-READ < READ-COMMITTED < READ-UNCOMMITTED
(如果有不对的地方还请多多指出)