精华内容
下载资源
问答
  • 我们知道从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都需要进行回滚。


    展开全文
  • Session是和线程关联的,当另起一个的异步线程时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:06
    javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
  • 关联属性 持续与属性包 属性包 使用ActiveX控件界面向导 了解控件寿命 生成ActiveX控件 生成无约束控件 生成设计时数据约束控件 生成运行数据约束控件 小结 第6章 用VC++建立InternetCOM组件 ...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    12、写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:00
    12、写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组件 ...
  • |____4-1 ES6特性以及ReactJS入门 |____24 项目框架架构与优化 |____06-NIO与Netty编程 |____05-Netty网络编程 |____04-ORM思想及相关框架实现原理 |____03-MVC |____02-数据库优化 |____01-JVM优化 |____...
  • 一. 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入门高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和...
  • 当客户机第一次调用一个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精美思维导图 程序员...
  • 何能以高性价比的方式挖掘有价值的信息是目前数据挖掘研究的课题。 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——应用程序通用...
  • ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态...事务工作原理标准/模糊查询筛选数据数据字典查看器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的模板库和工具类 ...
  • 实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143...
  • 实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143...
  • 实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143...
  • 实例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...
  • 实例137 使用线程局部变量实现线程同步 实例138 简单的线程通信 实例139 简单的线程死锁 实例140 解决线程的死锁问题 6.3 线程的进阶 实例141 使用阻塞队列实现线程同步 实例142 新建有返回值的线程 实例143...
  • ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。” 大概的意思有两点: a. ThreadLocal提供了一种访问某个变量的特殊方式:访问的变量属于...
  • SqISession (会话) :好比是Connection ,线程不安全的,每次使用开启的SqlSession对象,使用完毕正常关闭,默认使用DefaultSqlSession。提供操作数据库的增删改查方法,可以调用操作方法,也可以操作Mapper组件。 ...
  • 实例137 使用线程局部变量实现线程同步 177 实例138 简单的线程通信 179 实例139 简单的线程死锁 180 实例140 解决线程的死锁问题 182 6.3 线程的进阶 183 实例141 使用阻塞队列实现线程同步 183 实例142 新建有...
  • 实例137 使用线程局部变量实现线程同步 177 实例138 简单的线程通信 179 实例139 简单的线程死锁 180 实例140 解决线程的死锁问题 182 6.3 线程的进阶 183 实例141 使用阻塞队列实现线程同步 183 实例142 新建有...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

新线程到事务关联