Skip to content

Commit 522fb8c

Browse files
committedJul 10, 2022
Update mysql-questions-01.md
1 parent 7143240 commit 522fb8c

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed
 

‎docs/database/mysql/mysql-questions-01.md

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

0 commit comments

Comments
 (0)
Please sign in to comment.