利用InnoDB实施序列化隔离级别的方法
innodb的序列化的实现的实现方式主要有两种。
首先,当SELECT语句显式事务中的块,如1号的11-9表的实现,将应用于表11-6按(lock_s锁,锁记录事务锁兼容性表显示,lock_s)锁互斥写锁,所以序列化隔离级别只允许并发读写操作的并发访问是禁止的,因此,实现序列化。
相应的代码如下所示:
ha_innobase::external_lock(…)
{…
如果(lock_type!= f_unlck){
MySQL正在设置一个新表
…
如果(TRX -> isolation_level = = trx_iso_serializable / / SERIALIZABLE隔离级别
m_prebuilt -> select_lock_type = = lock_none
thd_test_options(THD,option_not_autocommit)和option_begin |){ / /显式事务中的块
获取序列化我们/执行让InnoDB概念add'lock股票mode'to所有选择
否则将是一致的读取。例外是一致的读取。
我们知道它们是只读事务,如果一致读取,它们也可以序列化。
m_prebuilt -> select_lock_type = lock_s; / /读锁,以共享方式namely'lock
m_prebuilt -> stored_select_lock_type = lock_s;
}否则,不要锁定(这很重要)
…
{人}
TrxInInnoDB::end_stmt(TRX);
debug_sync_c(ha_innobase_end_statement );
}
}…
其次,当SELECT语句不是显式事务中的数据块,通过获取最新的快照读取(在事务开始)。在这一点上,因为基于快照的一致性不需要锁定,锁定的情况下对应的表11-9数为2的情况。
表11-9序列化隔离级别的锁
解释uff1a
S0:SELECT * FROM蓝海C1 = 2; / /使用主键索引条件
另外,为了冲水…读锁语句序列化隔离级别也需要加锁lock_s
代码如下:
ha_innobase::store_lock(
…
检查带有* * *锁定的刷新表…
如果(TRX -> isolation_level = = trx_iso_serializable){
m_prebuilt -> select_lock_type = lock_s;
m_prebuilt -> stored_select_lock_type = lock_s;
{人}
m_prebuilt -> select_lock_type = lock_none;
m_prebuilt -> stored_select_lock_type = lock_none;
}
…
}
序列化是相关的innobase_query_caching_of_table_permitted()函数,和序列化隔离级别不允许缓冲区查询。
总结
以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,您可以留言交流,谢谢您的支持。