事务的特征ACID中,I是指Isolation,隔离性,即并发事务之间相互影响的程度。当事务并发操作时,可能出现脏读,不可重复读,幻读,而事务的隔离级别能够相应的解决出现的问题。
脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。
事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。
出现的原因就是事务并发修改记录。
要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。
幻读:在同一个事务中,同一个查询多次返回的结果不一致。
事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。
幻读是由于并发事务增加记录导致的
这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。
事务的隔离级别从低到高有:
Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
隔离级别和解决的程度
隔离等级
脏读
不可重复读
幻读
读未提交
YES
YES
YES
读已提交
NO
YES
YES
可重复读
NO
NO
YES
串行化
NO
NO
NO
总结:
事务的提出主要是为了解决并发情况下保持数据一致性的问题。通过选用不同的隔离等级就可以在不同程度上避免事务处理中所面临的各种问题。但是隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。