大家好,我是锋哥。今天分享关于【Mysql并发事务带来哪些问题?】面试题。希望对大家有帮助;
Mysql并发事务带来哪些问题?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
在 MySQL 中,事务并发执行时会引发一系列问题,主要由于并发操作可能导致数据不一致或执行顺序不符合预期。以下是并发事务可能带来的几种常见问题:
1. 脏读(Dirty Read)
脏读指的是一个事务读取到了另一个事务尚未提交的数据。假设事务A修改了某个数据,但是事务A尚未提交,此时事务B读取了这个数据。如果事务A最后回滚,那么事务B读取到的数据就是无效的,这就导致了“脏读”。
- 举例:事务A更新了某个数据,但还未提交,事务B读取了这个数据并进行了操作。若事务A回滚,事务B的操作就基于一个无效的数据。
2. 不可重复读(Non-repeatable Read)
不可重复读发生在一个事务读取数据后,另一个事务修改了数据并提交,导致第一个事务在同一操作中再次读取该数据时,结果发生变化。这种情况会导致事务读取到的数据不一致。
- 举例:事务A读取了某个数据,事务B修改并提交了该数据,接着事务A再次读取时,数据发生了变化。
3. 幻读(Phantom Read)
幻读指的是一个事务在读取一组数据时,另一个事务插入、删除或更新了满足某一条件的行,导致第一次读取的结果和第二次读取的结果不一致。幻读的发生是因为事务在执行过程中,底层数据的数量发生了变化。
- 举例:事务A查询满足某一条件的数据(比如选择所有金额大于100的记录),事务B向表中插入了一条满足此条件的新数据。若事务A重新执行查询,它会看到新的结果。
4. 死锁(Deadlock)
死锁发生在两个或多个事务在执行过程中,因争夺资源而互相等待,导致事务无法继续执行下去,最终系统可能进入一种僵局。MySQL会检测到死锁并回滚其中一个事务,以便解除死锁。
- 举例:事务A锁定了资源1,事务B锁定了资源2,然后事务A试图获取资源2,而事务B试图获取资源1,两个事务相互等待,形成死锁。
5. 写偏差(Write Skew)
写偏差发生在多个事务并发修改相关数据时,它们各自独立操作,但在最终结果上产生不一致。写偏差不一定是直接的冲突,但它们可能导致逻辑错误或不一致的状态。
- 举例:事务A和事务B都读取了同一数据,分别做出了更改并提交,结果可能与预期不符。
如何解决并发事务带来的问题?
MySQL 提供了不同的事务隔离级别来解决这些并发问题,具体包括:
- 读未提交(READ UNCOMMITTED):允许脏读,事务间几乎没有任何隔离。
- 读已提交(READ COMMITTED):避免脏读,但仍然可能发生不可重复读。
- 可重复读(REPEATABLE READ):防止脏读和不可重复读,是 MySQL 默认的事务隔离级别,但可能会发生幻读。
- 串行化(SERIALIZABLE):提供最强的隔离性,防止脏读、不可重复读和幻读,但性能较差,因为它会强制事务串行执行。
总结
MySQL 的并发事务可能带来脏读、不可重复读、幻读、死锁和写偏差等问题。通过调整事务的隔离级别,可以不同程度地避免这些问题,但通常需要在性能和数据一致性之间进行平衡。