
【计】 unrepeatable read
在数据库事务处理领域,"不可重复读"(Non-repeatable Read)指同一事务内重复读取相同数据时结果不一致的现象。其核心特征和英文对照如下:
汉语释义
当某个事务两次读取同一数据期间,另一并发事务修改了该数据并提交,导致第一次与第二次读取结果不一致。
英文术语
Non-repeatable Read
(来源:IBM Documentation
时序条件
(来源:Oracle Database Concepts
与脏读的区别
不可重复读针对已提交数据的修改(对比"脏读"读取的是未提交数据)。
(来源:Microsoft SQL Server Transactions
通过提高事务隔离级别避免:
(来源:PostgreSQL Documentation
-- 事务A
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE id=1; -- 返回100
-- 事务B此时更新余额并提交
SELECT balance FROM accounts WHERE id=1; -- 返回80(结果不可重复)
COMMIT;
(数据一致性风险参考:MySQL InnoDB Locking
不可重复读是数据库事务中的一种数据不一致现象,指在同一个事务内多次读取同一数据时,由于其他事务的修改导致结果不一致。以下是具体解释:
事务内不一致性
事务A第一次读取数据后,事务B对该数据进行了修改并提交。当事务A再次读取时,发现数据内容已变化。
与脏读的区别
不可重复读针对的是其他事务已提交的修改,而脏读是读取未提交的数据。
SELECT ... FOR UPDATE
对数据加锁,阻止其他事务修改。-- 事务A
BEGIN;
SELECT balance FROM account WHERE id=1; -- 结果为100元
-- 事务B执行并提交
UPDATE account SET balance=80 WHERE id=1;
COMMIT;
-- 事务A再次查询
SELECT balance FROM account WHERE id=1; -- 结果为80元
COMMIT;
此时事务A的两次查询结果不同,即发生了不可重复读。
不可重复读与幻读的区别:前者针对同一数据的修改(如数值变化),后者涉及新增或删除行导致结果集变化(如查询结果行数不同)。
棒状帚菌素巴斯德氏培养基苯甲吗啉氯茶碱编译程序要求多边的发出尖叫声音者刚果玉红接线法记录的保存聚硫橡胶粘合剂可引用关键词累积刑罚流行性恶心硫酸后马托品氯钯酸盐内油机车镍疹农业保护主义女法官气臌亲笔遗嘱气腔形成热原子退火施提林氏骶核送达回条胎移位逃狱托架危害程度