事务隔离级别
why ? what ? when ? how ?
为什么需要事务隔离级别?
为了保证并发操作数据的正确性及一致性。
隔离性:当多个线程都开启事务来操作数据库中的数据时,数据库系统要进行隔离操作,以保证各个线程获取数据的准确性。
不考虑事务的隔离性,会产生几种问题:
脏读:(针对未提交数据),如果一个事务对数据进行了更新,但是事务还没有提交,而另外一个事务可以“看到”到这个这个事务的没有提交更新的结果,如果第一个事务回滚,那么第二个事务在此之前所“看到”的数据就是一笔脏数据。
不可重复读:是指同一事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如事务 1 在事务 2 的更新操作之前读取一次数据,在事务 2 的更新操作之后再读取同一笔数据一次,两次结果是不同的。不可重复读的重点是修改。
幻读:指同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。幻读的重点在于新增或者删除 (数据条数变化)
事务 4 个隔离界别
Read Uncommitted, Read commited, Repeatable read, Serializable
Read Uncommitted 最低的隔离级别,一个事务可以读取另一个事物并未提交的更新结果。
Read Committed. 通常是大部分数据库采用的默认隔离级别,它在Read Uncommitted隔离级别基础上所做的限定更进一步, 在该隔离级别下,一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。 可以避免脏读,但是无法避免不可重复读取和幻读的问题。
Repeatable Read. 隔离级别可以保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。 Repeatable Read隔离级别避免了脏读和不可重复读取的问题,但无法避免幻读。(mysql默认隔离级别)
Serializable. 最为严格的隔离级别,所有的事务操作都必须依次顺序执行,可以避免其他隔离级别遇到的所有问题,是最为安全的隔离级别, 但同时也是性能最差的隔离级别。 因为该隔离级别极大的影响系统性能,所以,很少场景会使用它。通常情况下,我们会使用其他隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证了系统性能不会损失太大,也能够一定程度上保证数据的一致性。