幻读和不可重复读的区别

一 不可重复读 (Non-Repeatable Read)
不可重复读是指在一个事务内多次读取同一数据的时候,由于其他事务对这些数据进行了修改并提交,导致读取的结果不一致。换句话说,在同一个事务中,如果两次读取之间有另一个事务修改了数据并提交,那么第一次读取和第二次读取可能会得到不同的结果。

举个简单例子:

事务 A 读取行 x = 100。
另一个事务 B 更新行 x 为 200 并提交。
事务 A 再次读取行 x,发现其值变为 200。
在这种情况下,事务A第一次读取到的数据与第二次读取到的数据不一致,即使两次读取操作都在同一个事务中进行。

这就是不可重复读,可以看到,不可重复读强调的是同一条数据被修改。

二 幻读 (Phantom Read)
幻读是指在一个事务内多次执行相同的查询时,由于其他事务插入或删除了一些记录,导致返回的记录数量或具体内容发生变化的现象。这种现象之所以被称为“幻读”,是因为原本不存在的记录似乎突然出现(或者消失),就像幽灵一样。

举个简单的例子:

事务 A 执行 SELECT * FROM table WHERE id > 5,返回 n 条记录。
另一个事务 B 插入了一条 id=6 的记录并提交。
事务 A 再次执行相同的查询,这次返回 n+1 条记录。
在这种情况下,事务 A 第一次查询到的记录数与第二次查询到的记录数不同,即使两次查询操作都在同一个事务中进行。

总结下就是:

不可重复读和幻读都是在同一个事务中执行相同的 SQL 多次,结果不同。在这个过程中,不可重复读说的是读取的记录被 update,而幻读则强调读取的记录中出现了 insert 或者 delete 操作。

你可能感兴趣的:(javascript)