「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
在SQL标准中,规定了四种隔离级别,规定了在多个事务并发运行的时候,每个事务之间互相是如何隔离,从而避免一些事务并发问题。这四种级别为:read uncommitted(读未提交)、read committed(读已提交), repeatable read(可重复读),serializable(串行化)
Read Uncommitted(读未提交)
这种隔离级别是不允许发生脏写,也就是说不可能两个事务在没提交的情况下同时更新同一行数据,但是这种情况会发生:脏读,不可重复度,幻读。这种事务只是解决了脏写的问题,另外三个事务问题并没有解决。
Read Committed(读已提交)
这种隔离级别不会发生脏写和脏读,也就是说别人的事务在没提交修改值的情况下,是绝对读取不到的,但是这种情况会发生:不可重复读和幻读,只要别人的事务对数据进行了提交,那么就会被读取到,会导致同一个事务内,不同时间段读取到的数据是不一样的,导致数据不可重复读,幻读也会发生,读取到的数据条数不一致。 简称:RC,这个级别对于其他事务提交修改后,可以读取到修改后的值,但是其他事务未提交,那么修改的值是绝对读取不到的。
Repeatable Read(可重复读)
这种隔离级别,不会发生脏写、脏读和不可重复读的问题,一个事务多次查询一个数据的值,其他事务对这个值进行修改后并成功提交,那么事务级别下也不会读取到别人修改后的值,因为事务一旦开始,多次查询一个值,会一直读到同一值。但是该事务隔离级别会导致幻读的情况发生,多次读取到的数据条数不一致。 简称:RR,这种级别保证不会读取到其他事务已经提交的修改的值,但是会发生幻读。
在MySQL中RC,RR这两种事务隔离机制用的比较多,系统默认级别是RR级别,在MySQL事务隔离级别中,RR事务可以避免幻读的问题,采用MVCC机制,数据不同的版本链根据事务ID来解决了幻读问题。 一般情况下都用MySQL默认事务RR级别,这种情况下不会发生脏写,脏读,不可重复读和幻读的问题,事务的执行都是并行的,并且互不影响。对于RC事务隔离级别根据业务场景而选择,例如有些业务场景需要时刻读取最新数据,这个时候用RC事务比较好。
Serializable(串行化)
这种级别,不允许多个事务并发执行,只能够串行执行,在这种情况下不会发生幻读,因为是串行执行,不会对同一行数据进行操作,从根本上不会发生多事务的并发问题。这种事务的性能是极差的。在生产中基本上不会用到这种事务隔离机制,处理数据的性能极差。