MYSQL中的四种隔离级别

最近学习Mysql的隔离级别,记录一下,资源整合,写错莫怪,可能有错误


什么是脏读,不可重复读,和幻读


-- 脏读(Dirty Read):一个事务读取到了另一个事务尚未提交的数据。

-- 不可重复读(Non-repeatable Read):一个事务多次读取同一数据,但在事务过程中,其他事务对该数据进行了修改,导致读取到的数据不一致。

-- 幻读(Phantom Read):一个事务多次读取同一数据范围,但在事务过程中,其他事务对该范围内插入或删除了数据,导致读取到的数据集合发生了变化。


四种隔离级别


读未提交(Read Uncommitted):这是最低级别的隔离级别。在该级别下,一个事务可以读取到其他未提交事务所做的修改。这可能导致脏读、不可重复读和幻读等问题。

读已提交(Read Committed):在该级别下,一个事务只能读取到已经提交的数据。这样可以避免脏读问题,但仍然可能出现不可重复读和幻读问题。

可重复读(Repeatable Read):在该级别下,事务开始时读取的数据集将保持一致性,即使其他事务对该数据进行了修改。这可以避免脏读和不可重复读问题,但仍然可能出现幻读问题。

串行化(Serializable):这是最高级别的隔离级别。在该级别下,事务串行执行,确保不会出现并发问题。它通过对读取的数据加共享锁,并对写入的数据加排他锁来实现。串行化隔离级别可以避免脏读、不可重复读和幻读问题,但也会带来最高的并发性能开销。

需要注意的是,较高的隔离级别会带来更多的锁竞争和资源占用,从而影响并发性能。因此,在选择隔离级别时,应根据应用的具体需求和并发性能要求进行权衡。默认情况下,大多数数据库系统采用的是读已提交(Read Committed)隔离级别。


mysql 默认的隔离级别是什么?


MySQL 默认的隔离级别是可重复读(REPEATABLE READ)。可重复读是MySQL的默认事务隔离级别,提供了较高的数据一致性。在可重复读隔离级别下,事务读取的数据集合是固定的,即使其他事务对数据进行了修改,当前事务读取的结果仍然与事务开始时保持一致。

在可重复读隔离级别下,MySQL 使用多版本并发控制(MVCC)来实现事务的隔离性。MVCC 通过保存数据在不同时间点的快照,以及使用行级锁来防止不可重复读和脏读等问题。

虽然可重复读隔离级别提供了较高的数据一致性,但也可能导致幻读(Phantom Read)问题。幻读指的是在一个事务中,同一查询多次读取时,得到的结果集可能会发生变化,即读取到了其他事务插入或删除的数据。

如果需要更高的隔离级别,可以将隔离级别设置为串行化(SERIALIZABLE),但这可能会对并发性能产生一定的影响。选择合适的隔离级别需要根据应用程序的需求和特点进行权衡。


隔离级别中的锁


在 MySQL 中,锁主要分为两类:共享锁(Shared Lock)和排他锁(Exclusive Lock)。当一个事务在读取数据时,可以获取共享锁,多个事务可以同时持有共享锁,这样可以实现读取数据的并发性。而当一个事务对数据进行修改时,需要获取排他锁,只有持有排他锁的事务才能对数据进行修改,这样可以避免多个事务同时修改同一行数据导致数据不一致。

事务中的锁可以用来控制以下情况:

避免脏读(Dirty Read):当一个事务对某个数据进行修改时,通过加排他锁,其他事务无法读取到该修改中间状态的数据,在事务提交后才能读取最终结果。(加排它锁后,不能对该条数据再加锁,能查询但不能更改数据)

防止不可重复读(Non-repeatable Read):通过共享锁,一个事务读取到的数据在事务过程中不会被其他事务修改,保证了读取的一致性。

防止幻读(Phantom Read):通过锁定索引范围,防止其他事务在事务过程中插入或删除符合条件的数据,保证了读取的一致性。

需要注意的是,使用锁机制可能会对并发性能产生影响,特别是在高并发环境下。因此,在设计数据库应用时需要根据业务需求和性能要求来选择合适的锁策略和隔离级别,以平衡数据一致性和并发性能。

猜你喜欢

转载自blog.csdn.net/lfeishumomol/article/details/132143246