在我们了解数据库隔离级别前先来回顾一下数据库读数据时可能遇到的问题:
(1)脏读
一个事务对数据进行更新操作,但还完成,此时另一事务读取该数据,如果此时第一个事务由于操作失败进行了回滚,那么此时另外事务读取的数据就是脏数据。
(2)不可重复读
例如事务A在读取某一数据,而事务B立马修改了这个数据并且提交事务给数据库,事务A再次读取该数据就得到了不同的结果,发送了不可重复读。
ps:在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……
(3)幻读
事例:事务A将表中所有数据都清为0,就在这时事务B插入了一条2的数据,此时A再查看发现出现了一条为2的数据,就像发生了幻觉一样。
四种隔离级别
(1)Read uncommitted
读未提交,读的事务还没有提交就会被读,会出现脏读的现象。 ----写允许读
(2)Read committed
读提交,就是只读提交后的事务,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。 ----写禁止读
(3)Repeatable read
可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。 ----读禁止写,写禁止所有事务。
(4)Serializable
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
说到事务的特性之前我们先来谈谈什么是事务
定义:数据库事务是构成单一逻辑工作单元的操作集合
举个例子:
BEGIN TRANSACTION //事务开始 SQL1 SQL2 SQL3 ... COMMIT/ROLLBACK //事务提交或回滚
事务的四大特性:
原子性(atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
一致性(consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性(isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。