时间:2021-05-25
序列化的实现
InnoDB对于序列化的实现方式,是通过两种方式实现的。
第一种,当SELECT语句在一个显式的事务块内,如执行表11-9中的编号为1的情况,将施加LOCK_S锁,根据表11-6(记录锁事务锁相容表)可知,LOCK_S锁排斥写锁,所以序列化隔离级别下只允许并发地读取操作,并发写被禁止,因此实现了可序列化。
相应代码如下:
ha_innobase::external_lock(...){... if (lock_type != F_UNLCK) { ... if (trx->isolation_level == TRX_ISO_SERIALIZABLE //序列化隔离级别 && m_prebuilt->select_lock_type == LOCK_NONE && thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { //且在一个显式事务块内部 m_prebuilt->select_lock_type = LOCK_S; //加读锁,即 'LOCK IN SHARE MODE' m_prebuilt->stored_select_lock_type = LOCK_S; } //否则,不加锁(这一点也很重要)... } else { TrxInInnoDB::end_stmt(trx); DEBUG_SYNC_C("ha_innobase_end_statement"); }...}第二种,当SELECT语句不在一个显式的事务块内,则通过获取最新快照(在事务开始的时候,),然后读取数据。此时,因基于快照的一致性读不需要加锁,所以其加锁情况对应到了表11-9中的编号2对应的情况。
表11-9 序列化隔离级别加锁情况
说明:
S0:SELECT * FROM bluesea WHERE c1=2; //使用主键索引做WHERE条件
另外,对于FLUSH...WITH READ LOCK语句,序列化隔离级别下也需要加读锁LOCK_S
代码如下:
ha_innobase::store_lock(... if (trx->isolation_level == TRX_ISO_SERIALIZABLE) { m_prebuilt->select_lock_type = LOCK_S; m_prebuilt->stored_select_lock_type = LOCK_S; } else { m_prebuilt->select_lock_type = LOCK_NONE; m_prebuilt->stored_select_lock_type = LOCK_NONE; } ...}与序列化相关的,还有innobase_query_caching_of_table_permitted()函数,序列化隔离级别不允许缓冲查询。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#实现Xml序列化与反序列化的方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下://////Xml序列化与反序列化///publi
序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法。具体如下:一般来说,.net中的序列化其实就是将一个对象的
实现java.io.Serializable接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。序列化类的所有子类本身都是可序列化
方法一:引入System.Web.Script.Serialization命名空间使用JavaScriptSerializer类实现简单的序列化序列化类:Per
MySQL四种事务隔离级别详解及对比按照SQL:1992事务隔离级别,InnoDB默认是可重复读的(REPEATABLEREAD)。MySQL/InnoDB提供