-
mysql 多线程复制_MySQL支持多线程复制-阿里云开发者社区
2021-02-01 21:35:26我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制。这意味着没有冲突的事务可以在备库并发执行。很显然,备库的事务提交顺序和主库是不能保证一致的。这可能带来一些...我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制。这意味着没有冲突的事务可以在备库并发执行。很显然,备库的事务提交顺序和主库是不能保证一致的。
这可能带来一些问题,尤其是事务之间有一定的业务关联时,提供读访问时可能会带来业务上的不一致问题。因此在MySQL 5.7.6版本,引入了一个新的特性,来保证主库和备库的commit顺序是一致的。
对应的changelog:
Replication: Multi-threaded slaves can use the new slave_preserve_commit_order variable to ensure that the order which transactions were committed on the master is preserved on the slave. This prevents the slave from entering a state that the master was not in and is well suited to using multi-threaded slaves for replication read scale-out.
主要修改思路:
增加了新类Commit_order_manager,来维护COMMIT的worker队列顺序。当START SLAVE时,发现选项被打开,使用多线程复制,并且备库的log_slave_update和binlog均打开时,就初始化一个类对象(handle_slave_sql)
当使用基于LOGIC CLOCK的方式来分发事务时,这些被分发的事务拥有相同的标记(在主库上同时被提交,可以确保没有事务冲突),因此可以被备库的worker线程并发执行。
在分配事务给一个worker线程时,worker入队列(Mts_submode_logical_clock::get_least_occupied_worker),调用函数Commit_order_manager::register_trx, 线程状态设置为OCS_WAIT
在事务commit,进入GROUP COMMIT的FLUSH STAGE之前,如果当前worker之前还有事务没有进入FLUSH STAGE,则等待(Commit_order_manager::wait_for_its_turn);直到该worker成为队列头,状态设置为OCS_SIGNAL。
进入FLUSH STAGE后,当前Worker会通知它的后一个worker可以进入FLUSH STAGE了,并将自己从队列中移除(mngr->unregister_trx(worker))。worker状态修改为OCS_FINISH。
由于FLUSH STAGE主要用于将binlog 从cache刷入文件,因此只要在该阶段保证有序即可。
另外为了保证有序性,一旦前面的事务执行失败,排在后面的worker都需要进行回滚。
-
MySQL支持多线程复制
2016-05-10 15:22:18我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制。这意味着没有冲突的事务可以在备库并发执行。很显然,备库的事务提交顺序和主库是不能保证一致的。 这可能带来一些...我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制。这意味着没有冲突的事务可以在备库并发执行。很显然,备库的事务提交顺序和主库是不能保证一致的。
这可能带来一些问题,尤其是事务之间有一定的业务关联时,提供读访问时可能会带来业务上的不一致问题。因此在MySQL 5.7.6版本,引入了一个新的特性,来保证主库和备库的commit顺序是一致的。
对应的changelog:
Replication: Multi-threaded slaves can use the new slave_preserve_commit_order variable to ensure that the order which transactions were committed on the master is preserved on the slave. This prevents the slave from entering a state that the master was not in and is well suited to using multi-threaded slaves for replication read scale-out.
worklog:http://dev.mysql.com/worklog/task/?id=6813
代码:http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7985
主要修改思路:
增加了新类Commit_order_manager,来维护COMMIT的worker队列顺序。当START SLAVE时,发现选项被打开,使用多线程复制,并且备库的log_slave_update和binlog均打开时,就初始化一个类对象(handle_slave_sql)
当使用基于LOGIC CLOCK的方式来分发事务时,这些被分发的事务拥有相同的标记(在主库上同时被提交,可以确保没有事务冲突),因此可以被备库的worker线程并发执行。
在分配事务给一个worker线程时,worker入队列(Mts_submode_logical_clock::get_least_occupied_worker),调用函数Commit_order_manager::register_trx, 线程状态设置为OCS_WAIT
在事务commit,进入GROUP COMMIT的FLUSH STAGE之前,如果当前worker之前还有事务没有进入FLUSH STAGE,则等待(Commit_order_manager::wait_for_its_turn);直到该worker成为队列头,状态设置为OCS_SIGNAL。
进入FLUSH STAGE后,当前Worker会通知它的后一个worker可以进入FLUSH STAGE了,并将自己从队列中移除(mngr->unregister_trx(worker))。worker状态修改为OCS_FINISH。
由于FLUSH STAGE主要用于将binlog 从cache刷入文件,因此只要在该阶段保证有序即可。
另外为了保证有序性,一旦前面的事务执行失败,排在后面的worker都需要进行回滚。
-
创建异步线程时,Hibernate报No Session异常
2019-01-08 10:29:46Session是和线程相关联的,当另起一个新的异步线程时getCurrentSession会找不到当前的Session,所以需要手动创建Session并开启事务进行提交。 注意: 1、使用openSession开启一个新的Session而不是获取当前Session...SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,Session是和线程相关联的,当另起一个新的异步线程时getCurrentSession会找不到当前的Session,所以需要手动创建Session并开启事务进行提交。
注意:
1、使用openSession开启一个新的Session而不是获取当前Session
2、使用Session开启事务(session.begainTransaction()),而不是transaction.begin()然后TransactionSynchronizationManager.bindResource(this.sessionFactory, session)绑定进行事务管理最后transaction.commit();
代码如下:
try { Session session = sessionFactory.openSession(); session.beginTransaction(); //TODO 要做的事。。。。 。 。 。 session.getTransaction().commit(); if (session != null) { session.close(); } }catch (Exception e){ log.error("保存异常",e); }
-
java api最新7.0
2013-10-26 17:34:06javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ... -
COM与COM+从入门到精通(pdf版本,含源码)
2012-07-18 16:18:46可关联属性 持续与属性包 属性包 使用ActiveX控件界面向导 了解控件寿命 生成ActiveX控件 生成无约束控件 生成设计时数据约束控件 生成运行数据约束控件 小结 第6章 用VC++建立InternetCOM组件 ... -
最新Java面试宝典pdf版
2011-08-31 11:29:2212、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托... -
Java面试宝典2012新版
2012-06-26 19:20:0012、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托... -
COM 与 COM+ 从入门到精通 书籍
2008-09-09 16:06:30可关联属性 持续与属性包 属性包 使用ActiveX控件界面向导 了解控件寿命 生成ActiveX控件 生成无约束控件 生成设计时数据约束控件 生成运行数据约束控件 小结 第6章 用VC++建立InternetCOM组件 ... -
黑马57期黑马最新资源来咯
2019-04-28 17:35:47|____4-1 ES6新特性以及ReactJS入门 |____24 项目框架架构与优化 |____06-NIO与Netty编程 |____05-Netty网络编程 |____04-ORM思想及相关框架实现原理 |____03-MVC |____02-数据库优化 |____01-JVM优化 |____... -
从J2SE到J2EE知识点介绍
2012-12-07 15:03:19一. Java基础 5 (一). Java运行环境 5 1.eclipse的安装 5 2.jdk的安装 5 3.配置环境变量 5 (二).java语言基础 6 ...(三) Spring 3.X 新特性(JavaConfig,SpEL)简介 285 1. JavaConfig 285 2. SpEL 287 -
python入门到高级全栈工程师培训 第3期 附课件代码
2018-06-07 09:38:42python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和... -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例... -
Android 常用六大框架
2015-06-01 10:50:56(7) 可将Cookies持久化到SharedPreferences 3、Afinal框架 项目地址:https://github.com/yangfuhai/afinal 主要有四大模块: (1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 (2) 注解... -
拿到一台新的Windows电脑,我会做什么? 线上排查工具Arthas 你会换掉Postman吗?我正在用HTTP Client... curl 使用 为什么需要Docker? Docker入门为什么可以这么简单? 聊聊Docker镜像 Java精美思维导图 程序员...
-
基于OpenCL的频繁项集挖掘研究
2013-06-08 14:25:45何能以高性价比的方式挖掘到有价值的信息是目前数据挖掘研究的新课题。 GPu通用计算技术的R益成熟为数据挖掘技术的发展注入了新的动力。 GPU通过与CPu截然不同的发展路线,由当初的专用图形处理器一步步走进今 天的... -
Delphi编程100例
2009-09-22 08:59:12实现指定扩展名文件和相应程序的关联 获取汉字拼音的首字母 监视剪贴板 在IE工具栏上增加一个按钮图标 软件注册机制的建立 复活节彩蛋的制作 SkinEngine控件——XP换肤 ActionList——应用程序通用功能列表 ... -
java 面试题 总结
2009-09-16 08:45:34例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望... -
Delphi7编程100例
2004-09-02 11:32:44实现指定扩展名文件和相应程序的关联 获取汉字拼音的首字母 监视剪贴板 在IE工具栏上增加一个按钮图标 软件注册机制的建立 复活节彩蛋的制作 SkinEngine控件——XP换肤 ActionList——应用程序通用... -
《Delphi7编程100例》代码
2006-02-23 09:05:59ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态...事务工作原理标准/模糊查询筛选数据数据字典查看器TDecisionGraph决策组件的使用明细表(Master/Detail)结构像处理文本资料一样处理数据表中... -
精通Qt4编程(第二版)源代码
2014-01-19 13:07:18\12.2.2 事务操作 304 \12.2.3 使用SQL模型类 304 \12.2.4 数据表示 308 \12.3 Qt数据库应用 310 \12.3.1 使用嵌入式数据库 310 \12.3.2 使用Oracle数据库 313 \12.4 小结 325 \第13章 Qt的模板库和工具类 ... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part1 高清完整PDF版
2016-06-13 15:46:48实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part4 高清完整PDF版
2016-06-13 16:13:13实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part2 高清完整PDF版
2016-06-13 15:53:27实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part3 高清完整PDF版
2016-06-13 16:11:24实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143... -
精通qt4编程(源代码)
2010-03-17 19:10:40\12.2.2 事务操作 304 \12.2.3 使用SQL模型类 304 \12.2.4 数据表示 308 \12.3 Qt数据库应用 310 \12.3.1 使用嵌入式数据库 310 \12.3.2 使用Oracle数据库 313 \12.4 小结 325 \第13章 Qt的模板库和工具类 326 \13.1... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part5 高清完整PDF版
2016-06-13 16:17:38实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143... -
ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。” 大概的意思有两点: a. ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于...
-
SqISession (会话) :好比是Connection ,线程不安全的,每次使用开启新的SqlSession对象,使用完毕正常关闭,默认使用DefaultSqlSession。提供操作数据库的增删改查方法,可以调用操作方法,也可以操作Mapper组件。 ...
-
Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3
2016-06-12 11:39:31实例137 使用线程局部变量实现线程同步 177 实例138 简单的线程通信 179 实例139 简单的线程死锁 180 实例140 解决线程的死锁问题 182 6.3 线程的进阶 183 实例141 使用阻塞队列实现线程同步 183 实例142 新建有... -
Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part1
2016-06-12 11:34:39实例137 使用线程局部变量实现线程同步 177 实例138 简单的线程通信 179 实例139 简单的线程死锁 180 实例140 解决线程的死锁问题 182 6.3 线程的进阶 183 实例141 使用阻塞队列实现线程同步 183 实例142 新建有...