1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Update mysql-questions-01.md

This commit is contained in:
guide 2022-07-10 20:06:48 +08:00
parent 7143240437
commit 522fb8cff4

View File

@ -276,7 +276,14 @@ COMMIT;
- **不可重复读Unrepeatable read:** 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。 - **不可重复读Unrepeatable read:** 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
- **幻读Phantom read:** 幻读与不可重复读类似。它发生在一个事务T1读取了几行数据接着另一个并发事务T2插入了一些数据时。在随后的查询中第一个事务T1就会发现多了一些原本不存在的记录就好像发生了幻觉一样所以称为幻读。 - **幻读Phantom read:** 幻读与不可重复读类似。它发生在一个事务T1读取了几行数据接着另一个并发事务T2插入了一些数据时。在随后的查询中第一个事务T1就会发现多了一些原本不存在的记录就好像发生了幻觉一样所以称为幻读。
**不可重复读和幻读区别** 不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改幻读的重点在于新增或者删除比如多次查询同一条查询语句DQL记录发现记录增多或减少了。 **不可重复读和幻读有什么区别呢?**
- 不可重复读的重点是内容修改或者记录减少比如多次读取一条记录发现其中某些列的值被修改;
- 幻读的重点在于记录新增比如多次执行同一条查询语句DQL发现查到的行数增加了。
幻读其实可以看作是不可重复读的一种特殊情况,单独把区分幻读的原因主要是解决幻读和不可重复读的方案不一样。
举个例子:执行 `delete``update` 操作的时候,可以直接对记录加锁,保证事务安全。而执行 `insert` 操作的时候由于记录锁Record Lock只能锁住已经存在的记录为了避免插入新记录需要依赖间隙锁Gap Lock。也就是说执行 `insert` 操作的时候需要依赖 Next-Key LockRecord Lock+Gap Lock 进行加锁来保证不出现幻读。
### SQL 标准定义了哪些事务隔离级别? ### SQL 标准定义了哪些事务隔离级别?