Mysql隔离级别
MySQL服务端是允许多个客户端连接的,这意味着 MySQL 会出现同时处理多个事务的情况。
那么在同时处理多个事务的时候,就可能出现
- 脏读(dirtyread):如果一个事务「读到」了另一个「「未提交事务修改过的数据,就意味着发生了「脏读」现象。
- 不可重复读(non-repeatableread):在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。
- 幻读(phantom read):一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的,就意味着发生了「幻读」现象情况。
mysql的是怎么解决并发问题的?
- 锁机制:Mysql提供了多种锁机制来保证数据的一致性,包括行级锁、表级锁、页级锁等。通过锁机制,可以在读写操作时对数据进行加锁,确保同时只有一个操作能够访问或修改数据。
- 事务隔离级别:Mysql提供了多种事务隔离级别,包括读未提交、读已提交、可重复读和串行化。通过设置合适的事务隔离级别,可以在多个事务并发执行时,控制事务之间的隔离程度,以避免数据不一致的问题。
- MVCC(多版本并发控制):MysqI使用MVCC来管理并发访问,它通过在数据库中保存不同版本的数据来实现不同事务之间的隔离。在读取数据时,Mysql会根据事务的隔离级别来选择合适的数据版本,从而保证数据的一致性。
隔离级别
读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;
读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;
可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQLInnoDB 引擎的默认隔离级别;
串行化(serializable);会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;
在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象
在「可重复读」隔离级别下,可能发生幻读现象,但是不可能发生脏读和不可重复读现象,
在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。
「可重复读」隔离级别怎么实现
可重复读隔离级是由 MVCC(多版本并发控制)实现的,实现的方式是开始事务后(执行 begin 语句后),在执行第一个查询语句后,会创建一个Read View,后续的查询语句利用这个 Read View,通过这个 Read View 就可以在 undo log 版本链找到事务开始时的数据,所以事务过程中每次查询的数据都是一样的,即使中途有其他事务插入了新纪录,是查询不出来这条数据的。
串行化隔离级别是通过什么实现的?
是通过行级锁来实现的,序列化隔离级别下,普通的 select 查询是会对记录加S型的 next-key 锁,其他事务就没有办法对这些已经加锁的记录进行增删改操作了,从而避免了脏读、不可重复读和幻读现象。
如何选择事务隔离级别
在选择事务隔离级别时,我们需要权衡数据的一致性和性能。如果应用程序的数据需要保证一致性,并且并发访问较少,那么可以选择串行化隔离级别。如果应用程序需要较高的性能,并且可以容忍一定的数据不一致性,那么可以选择较低的隔离级别。在一般情况下,我们可以选择可重复读隔离级别,因为它可以解决大部分并发访问问题,并且对性能影响相对较小。
在实际开发中如何选择事务隔离级别
在实际开发中,我们需要根据应用程序的需求和数据特点来选择适当的事务隔离级别。一般来说,在选择事务隔离级别时,需要考虑以下几个方面:
-
数据一致性要求:如果应用程序需要保证数据的一致性,那么需要选择较高的隔离级别。
-
并发访问的复杂性:如果应用程序的并发访问较为复杂,那么需要选择较高的隔离级别。如果并发访问较少,那么可以选择较低的隔离级别。
-
性能需求:如果应用程序对性能要求较高,那么需要选择较低的隔离级别。如果对性能的要求不高,那么可以选择较高的隔离级别。
-
数据库的大小:如果数据库的大小较大,那么应该避免选择串行化隔离级别,因为它会导致大量的锁竞争。

浙公网安备 33010602011771号