最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

既然MySQL中InnoDB使用MVCC,为什么REPEATABLE-READ不能消除幻读

来源:动视网 责编:小OO 时间:2024-12-17 04:05:29
文档

既然MySQL中InnoDB使用MVCC,为什么REPEATABLE-READ不能消除幻读

举个例子,假设在一个事务A中插入了一条新记录,而另一个事务B在同一时间读取了这个表。如果事务B的隔离级别设置为可重复读(Repeatable Read),那么在事务B的整个生命周期内,它将不会看到事务A所做的修改。这是因为MVCC机制确保了每个事务都能看到它开始时的数据版本,即使其他事务对数据进行了修改。然而,如果事务B的隔离级别低于可重复读,比如读已提交(Read Committed),那么它就有可能看到事务A所做的修改。在这种情况下,事务B可能会遇到幻读,因为它会看到之前不存在的新记录。
推荐度:
导读举个例子,假设在一个事务A中插入了一条新记录,而另一个事务B在同一时间读取了这个表。如果事务B的隔离级别设置为可重复读(Repeatable Read),那么在事务B的整个生命周期内,它将不会看到事务A所做的修改。这是因为MVCC机制确保了每个事务都能看到它开始时的数据版本,即使其他事务对数据进行了修改。然而,如果事务B的隔离级别低于可重复读,比如读已提交(Read Committed),那么它就有可能看到事务A所做的修改。在这种情况下,事务B可能会遇到幻读,因为它会看到之前不存在的新记录。

在新版本的MySQL中,InnoDB通过引入多版本控制(MVCC)机制,确实解决了幻读的问题。这意味着,如果你在执行一个事务时,没有检测到其他事务对数据所做的修改,这并不表示幻读现象不存在。实际上,这种现象可能只是因为你的事务隔离级别设置得不够高。

举个例子,假设在一个事务A中插入了一条新记录,而另一个事务B在同一时间读取了这个表。如果事务B的隔离级别设置为可重复读(Repeatable Read),那么在事务B的整个生命周期内,它将不会看到事务A所做的修改。这是因为MVCC机制确保了每个事务都能看到它开始时的数据版本,即使其他事务对数据进行了修改。

然而,如果事务B的隔离级别低于可重复读,比如读已提交(Read Committed),那么它就有可能看到事务A所做的修改。在这种情况下,事务B可能会遇到幻读,因为它会看到之前不存在的新记录。

因此,虽然MVCC机制在一定程度上避免了幻读,但它并不能完全消除所有类型的幻读现象。幻读的发生与否取决于事务的隔离级别设置。在可重复读的隔离级别下,MVCC机制能够确保事务不会看到其他事务在其执行过程中所做的修改,从而有效地避免了幻读。

总结来说,MVCC通过存储多个版本的数据,使得事务能够读取到它们开始时的数据状态,从而减少了幻读的可能性。但在某些特定的事务隔离级别下,幻读仍然可能发生,这是因为其他事务对数据所做的修改。

文档

既然MySQL中InnoDB使用MVCC,为什么REPEATABLE-READ不能消除幻读

举个例子,假设在一个事务A中插入了一条新记录,而另一个事务B在同一时间读取了这个表。如果事务B的隔离级别设置为可重复读(Repeatable Read),那么在事务B的整个生命周期内,它将不会看到事务A所做的修改。这是因为MVCC机制确保了每个事务都能看到它开始时的数据版本,即使其他事务对数据进行了修改。然而,如果事务B的隔离级别低于可重复读,比如读已提交(Read Committed),那么它就有可能看到事务A所做的修改。在这种情况下,事务B可能会遇到幻读,因为它会看到之前不存在的新记录。
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top