首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

mysql 谈谈innodb存储引擎

5.7版本引入了模式自动转换的功能,但该语法依然保留了。 另外一个有趣的点是,在5.7版本中,你可以通过设置session_track_transaction_info变量来跟踪事务的状态,这货主要用于官方的分布式套件(例如fabric),例如在一个负载均衡系统中,你需要知道哪些 statement 开启或处于一个事务中,哪些 statement 允许连接分配器调度到另外一个 connection。只读事务是一种特殊的事务状态,因此也需要记录到线程的Transaction_state_tracker中。 关于Session tracker,可以参阅官方WL#6631。 START TRANSACTION READ WRITE 和上述相反,该SQL用于开启读写事务,这也是默认的事务模式。但有一点不同的是,如果当前实例的 read_only 打开了且当前连接不是超级账户,则显示开启读写事务会报错。 同样的事务状态TX_READ_WRITE也要加入到Session Tracker中。另外包括上述几种显式开启的事务,其标记TX_EXPLICIT也加入到session tracker中。 读写事务并不意味着一定在引擎层就被认定为读写事务了,5.7版本InnoDB里总是默认一个事务开启时的状态为只读的。举个简单的例子,如果你事务的第一条SQL是只读查询,那么在InnoDB层,它的事务状态就是只读的,如果第二条SQL是更新操作,就将事务转换成读写模式。 START TRANSACTION WITH CONSISTENT SNAPSHOT 和上面几种方式不同的是,在开启事务时还会顺便创建一个视图(Read View),在InnoDB中,视图用于描述一个事务的可见性范围,也是多版本特性的重要组成部分。 这里会进入InnoDB层,调用函数innobase_start_trx_and_assign_read_view,注意只有你的隔离级别设置成REPEATABLE READ(可重复读)时,才会显式开启一个Read View,否则会抛出一个warning。 使用这种方式开启事务时,事务状态已经被设置成ACTIVE的。 状态变量TX_WITH_SNAPSHOT会加入到Session Tracker中。 AUTOCOMMIT = 0 当autocommit设置成0时,就无需显式开启事务,如果你执行多条SQL但不显式的调用COMMIT(或者执行会引起隐式提交的SQL)进行提交,事务将一直存在。通常我们不建议将该变量设置成0,因为很容易由于程序逻辑或使用习惯造成事务长时间不提交。而事务长时间不提交,在MySQL里简直就是噩梦,各种诡异的问题都会纷纷出现。一种典型的场景就是,你开启了一条查询,但由于未提交,导致后续对该表的DDL堵塞住,进而导致随后的所有SQL全部堵塞,简直就是灾难性的后果。 另外一种情况是,如果你长时间不提交一个已经构建Read View的事务,purge线程就无法清理一些已经提交的事务锁产生的undo日志,进而导致undo空间膨胀,具体的表现为ibdata文件疯狂膨胀。我们曾在线上观察到好几百G的Ibdata文件。 TIPS:所幸的是从5.7版本开始提供了可以在线truncate undo log的功能,前提是开启了独立的undo表空间,并保留了足够的 undo 回滚段配置(默认128个),至少需要35个回滚段。其truncate 原理也比较简单:当purge线程发现一个undo文件超过某个定义的阀值时,如果没有活跃事务引用这个undo文件,就将其设置成不可分配,并直接物理truncate文件。 事务提交 事务的提交分为两种方式,一种是隐式提交,一种是显式提交。 当你显式开启一个新的事务,或者执行一条非临时表的DDL语句时,就会隐式的将上一个事务提交掉。另外一种就是显式的执行“COMMIT” 语句来提交事务。 然而,在不同的场景下,MySQL在提交时进行的动作并不相同,这主要是因为 MySQL 是一种服务器层-引擎层的架构,并存在两套日志系统:Binary log及引擎事务日志。MySQL支持两种XA事务方式:隐式XA和显式XA;当然如果关闭binlog,并且仅使用一种事务引擎,就没有XA可言了。 关于隐式XA的控制对象,在实例启动时决定使用何种XA模式,如下代码段: if (total_ha_2pc > 1 || (1 == total_ha_2pc && opt_bin_log)) { if (opt_bin_log) tc_log= &mysql_bin_log; else tc_log= &tc_log_mmap; }

02

深度学习简化总结合注意力与循环神经网络推荐的算法

互联网将全球信息互连形成了信息时代不可或缺的基础信息平台,其中知识分享服务已经成为人们获取信息的主要工具。为了加快互联网知识共享,出现了大量以知乎为代表的问答社区[1] 。用户注册社区后可交互式提出与回答问题达到知识共享和交换。然而,伴随用户急剧增多,平台短时间内积攒了数目巨大、类型多样的问题,进进超过有效回复数,严重降低了用户服务体验。如何将用户提出的问题有效推荐给可能解答的用户,以及挖掘用户感兴趣的问题是这些平台面临的严重挑战。这种情况下,工业界和学术界对以上问题开展了广泛研究,提出了一些针对问答社区的专家推荐方法提高平台解答效率[2] 。现有工作大多利用基于内容的推荐算法解决该问题[3-6],比如配置文件相似性、主题特征相似性等,匹配效果依赖于人工构建特征的质量。近年来,以卷积神经网络(Convolutional Neural Network, CNN)、Attention 注意力机制为代表的深度学习技术不断収展,幵且已经成功应用到文本挖掘领域。相比于传统方法,深度模型可以学习到表达力更强的深度复杂语义特征。于是,出现了一些深度专家推荐算法,比如DeepFM[7] 、XDeepFM[8] 、CNN-DSSM 等,大大幅提升了传统推荐算法的准确度。虽然以上工作很好地实现了专家推荐,但都是根据用户长期关注的话题及相关解答历史刻画用户兴趣,产生的推荐结果也相对固定。随着时间推移,用户会不断学习新知识,其关注点及擅长解答的问题也很可能収生改变,由此会产生用户兴趣变化,甚至短期兴趣漂移[10] 。这些动态变化会严重影响推荐算法效果,所以如何动态刻画用户兴趣就显得尤为重要。其实,用户历史回答行为具有明显的时间序列关系,通过对已解答问题的序列分析有很大可能感知用户兴趣变化。近年来,循环神经网络(Recurrent Neural Network, RNN)被广泛用来处理序 列 数 据 , 比 如 长 短 期 记 忆 网 络 ( Long Short-Term Memory, LSTM)、门控循环单元(Gate Recurrent Unit, GRU)等,可以根据前面状态输入结合当前模型状态产生当前输出。该类方法可与 CNN结合处理问题内容序列数据,从用户历史解答行为中挖掘长期与短期兴趣,从而动态产生当前兴趣。综合以上讨论,本文提出了结合注意力机制与循环神经网络的问答社区专家推荐算法,能够根据用户历史解答序列动态构建用户兴趣特征,实现推荐结果随时间収展不断调整。 主要工作与贠献如下:(1)基于预训练词嵌入模型分别实现了问题标题与主题标签的语义嵌入向量表示,将 CNN 卷积模型与 Attention 注意力机制结合,构造基于上下文的问题编码器,生成不同距离上下文的深度特征编码。(2)问题编码器对用户历史回答的问题迚行序列编码,利用长短期记忆循环神经网络 Bi-GRU 模型处理编码后的问题序列,幵结合用户主题标签嵌入向量构造用户兴趣动态编码器。(3)将问题与用户编码器产生的深度特征点积运算后加入全连接层实现相似度计算产生推荐结果。在知乎公开数据集上的对比实验结果表明该算法性能要明显优于目前比较流行的深度学习专家推荐算法。

02

事务隔离级别

MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每 个客户端与服务器连接上之后,就可以称为一个会话( Session )。每个客户端都可以在自己的会话中 向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理 多个事务。事务有 隔离性 的特性,理论上在某个事务 对某个数据进行访问 时,其他事务应该进行 排 队 ,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样对 性能影响太大 ,我们既想保持 事务的隔离性,又想让服务器在处理访问同一数据的多个事务时 性能尽量高些 ,那就看二者如何权衡取 舍了。

03
领券