最近读High Performance MySQL,里面提到了innodb事务隔离级别是REPEATABLE-READ时,有这样一段话
引用
SELECT
InnoDB must examine each row to ensure that it meets two criteria:
a. InnoDB must find a version of the row that is at least as old as the transaction
(i.e., its version must be less than or equal to the transaction’s version). This
ensures that either the row existed before the transaction began, or the trans-
action created or altered the row.
b. The row’s deletion version must be undefined or greater than the transaction’s
version. This ensures that the row wasn’t deleted before the transaction began.
Rows that pass both tests may be returned as the query’s result.
来验证一下
show create table 20130302t1;
CREATE TABLE `20130302t1` (
`id` int(11) NOT NULL,
`b` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
表中有数据(1,1)
autocommit为false, tx_isolation 是REPEATABLE-READ
考虑以下两种情况
情况1
session A | session B |
start transaction;(A) | |
| start transaction |
| update 20130302t1 set b=2 where id=1; |
| commit; |
select * from 20130302t1;(B) | |
B处结果为(1,2),似乎不符合那段话里的a条件,A事务看到了transaction version更大的B事务
情况2
session A | session B |
| start transaction |
| update 20130302t1 set b=2 where id=1; |
start transaction | |
select * from 20130302t1; | |
| commit; |
select * from 20130302t1;(C) | |
C处结果为(1,1),也就是说,A事务没有看到transaction version更小的B事务
是不是那段话有问题呢,后来终于找到了
官方的文档,innodb通过read view来确定一致性读时的数据库snapshot,innodb的read view确定一条记录能否看到,有两条法则
1 看不到read view创建时刻以后启动的事务
2 看不到read view创建时活跃的事务
引用
Rule 1: When the read view object is created it notes down the smallest transaction identifier that is not yet used as a transaction identifier (trx_sys_t::max_trx_id). The read view calls it the low limit. So the transaction using the read view must not see any transaction with identifier greater than or equal to this low limit.
Rule 2: The transaction using the read view must not see a transaction that was active when the read view was created.
在情况1中,代码A处并没有创建read view,read view是在代码B处创建的.
如果把A处代码改为 START TRANSACTION WITH CONSISTENT SNAPSHOT;
才会创建read view,使得代码B返回(1,1)
在情况2中,B事务在A事务创建read view时处于ACTIVE状态,所以B事务不会被A事务看到.
这篇文章还提到了mysql5.6 在read only事务的优化,值得一看
分享到:
相关推荐
read view 是 InnoDB 引擎中的一个重要机制,用于实现 MVCC 机制。read view 包括三个部分: 1. 活跃事务 ID 列表:一个数值列表,用来维护 Read View 生成时刻系统正活跃的事务 ID。 2. up_limit_id:记录活跃事务...
一个事务对象称为`trx_struct`,其中包含了事务的ID、事务状态、锁信息和相关的ReadView。 - **mini-transaction(微事务):** mini-transaction是InnoDB内部的一个抽象,用于确保page级别的操作具有原子性。对于...
总的来说,ReadView机制是InnoDB实现MVCC的重要组成部分,它通过undo log和ReadView的配合,保证了在并发环境下的读一致性。理解和掌握这一机制,对于优化数据库性能、解决并发问题具有重要意义。
InnoDB的多版本并发控制是通过ReadView和 undo/redo日志实现的。ReadView是每个事务用于判断数据可见性的视图,根据事务的开始时间,决定能看到哪些数据版本。聚簇索引和二级索引共同构建了多版本的数据结构,使得在...
通过这样的机制,ReadView和undo log多版本链条一起确保了在多事务并发操作时,事务A不会读到事务B并发更新的数据版本,而只能读取到被其他事务提交的版本。这有助于避免脏读、不可重复读和幻读等并发问题。 总结来...
MVCC通过版本链和Read View机制实现了高并发下的数据一致性,而Buffer Pool通过缓存数据和索引页面来降低磁盘I/O开销,提高了整体性能。此外,Redo与Undo日志的结合使用确保了数据的持久性和事务的完整性。掌握这些...
MVCC的实现依赖于隐藏字段、undo log日志、read view等机制。 1. MVCC的目的 MVCC的主要目的就是为了解决数据库并发访问时的困难。早期的数据库系统,只有读读之间可以并发,读写、写读和写写都要因为加锁而相互...
MVCC通过read view来决定事务可以看到哪些版本的数据。Read view是一个快照,包含了在事务开始时所有未提交的事务ID。在读取数据时,事务会根据read view检查数据版本是否可见,如果版本在read view内,则不可见,...
ReadView是实现MVCC的关键数据结构,它根据事务的可见性来隔离不同版本的数据。聚簇索引和二级索引在InnoDB中起到了不同的作用,前者是表中记录的物理顺序,而后者是根据列值排序的记录。InnoDB支持聚簇索引和二级...
3. **可重复读(Repeatable Read)**: MySQL InnoDB默认的隔离级别,采用MVCC实现,避免了不可重复读,但在特定情况下仍可能产生幻读。 4. **串行化(Serializable)**: 最高的隔离级别,所有事务按照顺序执行,...
在MVCC中,每个事务都有一个`read_view`,它定义了哪些数据版本对当前事务是可见的。事务开始时,`read_view`包含了所有在事务开始前已经提交的事务ID,而在事务运行过程中开始的事务将被视为不可见。这样,即使在RR...
3. **Read View**:每个事务开始时生成一个Read View,用于判断哪些记录是可见的。 4. **Next-Key Locks**:在可重复读隔离级别下,InnoDB使用Next-Key Locks避免幻读问题,结合MVCC实现一致性读。 理解这些概念...
在InnoDB中,每个事务都有自己的视图,即read-view,用来确定事务可见的数据范围。 2. **trx_id和roll_pointer**:在每个记录中,MySQL添加了两个关键字段。`trx_id`记录了最后一次修改该记录的事务ID,而`roll_...
总的来说,InnoDB通过一致性读视图和MVCC实现了在可重复读隔离级别下的事务隔离,使得事务在执行期间看到的数据是一致的,不受其他事务的影响。然而,更新操作可能会因锁机制而产生等待,从而影响事务的并发性能。...
read view在MVCC(多版本并发控制)中扮演着重要角色,它定义了事务可见性规则。在MySQL中,创建read view时需要全局锁定trx_sys->mutex,并遍历事务链表,这在高并发环境下可能导致性能瓶颈。TXSQL借鉴Percona的...
- **read view**:在读取数据时,基于一致性视图确定应该看到哪个版本的数据。 3. **InnoDB与MyISAM的区别**: - **InnoDB**: - 支持事务处理和行级锁定,适合高并发和数据完整性要求高的应用。 - 使用聚集...