首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >InnoDB &隔离级别-可重复读取不是一件坏事吗?

InnoDB &隔离级别-可重复读取不是一件坏事吗?
EN

Database Administration用户
提问于 2014-12-02 06:46:15
回答 1查看 853关注 0票数 4

我读过关于InnoDB's 隔离水平的文章,这在很大程度上是有意义的,但我不明白的是,为什么unrepeatable reads是一件坏事呢?不应该是相反的吗?

例如:

因此,假设我们有一个用于销售产品的股票专栏,而每当有人购买某一项时,我们都会从该专栏中拿出1项内容,其中包含Repeatable readserializable隔离级别,这不会破坏数据的完整性吗?

例如:

代码语言:javascript
运行
复制
TX A: start transaction;
TX B: set session transaction isolation level repeatable read;
TX B: start transaction;
TX A: select stock from products;               -- val = 8
TX B: select stock from products;               -- val = 8
TX A: update products set stock = stock - 1;    -- val = 7
TX B: select stock from products;               -- val = 8
TX A: commit
TX B: select stock from products;               -- val = 8, incorrect!
TX B: commit;
TX B: select stock from products;               -- val = 7

除非它在运行更新时使用正确的值?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-12-02 11:08:37

InnoDB隔离级别不是“坏”或“好”,它取决于应用程序在隔离方面需要什么。

在您的示例中,通过使用可重复读取,可以确保一旦完成了第一个select,从该事务的角度来看,没有其他事务可以修改数据库的状态。换句话说,就好像您在第5行之前运行了"START TRANSACTION WITH CONSISTENT SNAPSHOT“。在某些情况下可能需要这样做,让我举个例子:

代码语言:javascript
运行
复制
TX A: START TRANSACTION;
TX A: SELECT * FROM products WHERE stock BETWEEN 4 AND 6; -- I see rows 4 and 6 only,
                                                          --  and I want to update those only   
TX B: START TRANSACTION;
TX B: INSERT INTO products (stock) VALUES (5);

TX A: UPDATE products SET stock = 3 WHERE stock BETWEEN 4 AND 6;
TX A: COMMIT; -- race condition
TX B: COMMIT;

通过设置InnoDB的REPEATABLE READ,幻影读取消失,因为TX将被锁定在插入,直到A提交。但是,如果我们正在执行READ COMMITTED,我们将得到不同的输出,这取决于A或B是否首先提交,这违反了ACID属性,并且我们的应用程序可能不会期望。

特别是,STATEMENT-based复制不需要幻影读取,这就是为什么READ COMMITTED是默认级别,甚至比其他数据库中的READ COMMITTED具有严格的行为(在其他数据库中,获得InnoDB行为需要可序列化)。如果第一个选择是一个更新,那么独立地执行这些事务将导致不同的结果(漂移从事务)。请注意,事务是以原子方式和顺序写入到binlog的。

我同意您的观点,即在大多数应用程序中可能不需要这样做,因为您将在应用程序级别处理这些情况。如果是这样,请使用ROW-based复制,并将默认事务隔离级别设置为READ COMMITTED。在大多数情况下,您还可以获得更好的并发性。

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/84057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档