Java帝国之宫廷内斗

Debug Assertion Failed错误如何消除 关于UpdateData(FALSE)的运用,UpdateData(FALSE)函数用来更新edit控件中的内容,但是UpdateData(FALSE)函数有一个弊端,就是在主窗口主线程程中用是没有问题的,但是一旦在非主线程(比如工作线程或者子线程)中使用,就会产生Debug Assertion Failed的错误,这个错误为线程冲突错误,是UpdateData(FALSE)函数在非主线程中使 阅读详情

前言: 本文是《持久化:Java帝国反击战》续集,开始讲解分布式事务。

1

 JDBC大臣

自从和东海之滨的数据库联合酋长国缔结了合作协议以后, IO大臣就退居二线了。

他本来也想把JDBC也划归自己管理, 奈何国王头脑发热、竟然任命了新的JDBC大臣, 专门负责这一摊事儿。

JDBC大臣经常在早朝上给国王吹风:  “ 陛下, 我们的JDBC设计的非常好, 别看什么Hibernate, Mybatis 是现在的事实标准, 他们底层都在用我们的JDBC接口。 ”

国王赞许地频频点头,似乎忘记了这是躲在角落中IO大臣的功绩。

IO大臣咬牙切齿又无可奈何。

这天JDBC又在给国王安利关系数据库的好处: “陛下,这关系数据库相比于简单的文件系统有个巨大的好处,就是支持事务。”

听到JDBC大臣又在贬低自己负责的部门, IO大臣怒火中烧。

国王问道:“什么是事务,要事务干嘛? ”

“我举个通俗的例子你就明白了, 假设IO大臣要给我转账100块钱, 他的数据库账户要扣掉100块, 我的账户要增加100块, 这就涉及到两个操作, 这两个操作要么全部完成,要么一个都不做,只有这样才能保证数据的一致性, 这就是一个事务。数据库联合酋长国有个对事务总结了4个特性: 原子性(Atomicity) ,一致性(Consistency), 隔离性(Isolation) , 持久性(Durability) , 简称ACID, 要不我再给详细的解释下?”

国王连忙摆手:“不不不, 别拿这些细节烦我, 你就告诉我们的臣民怎么去使用就行了”

JDBC大臣说: “这个很简单, 默认情况下我们的JDBC都会把对数据库的操作认为是一个事务, 当然臣民们也可以设置成手工的方式, 手工地提交和回滚事务。不管哪种方式,都是非常简单的 。”

国王说: “那就好, 爱卿辛苦了, 还有事吗? 有事启奏,无事退朝。”

2

 密谋

IO大臣回到家中,依然感觉火气难平, 招来幕僚商谈。

InputStream说: “大人, 这JDBC大臣虽然猖狂, 我们却暂时拿他没办法, 现在都是Web时代, 哪个应用不用数据库啊? ”

“难道就让他这么猖獗下去? ”

InputReader足智多谋: “我倒是有一计, 只是得等待时机。 ”

“什么时机?”

“你看今天JDBC那厮提到了事务, 但是这个事务只是在一个数据库中有用啊, 如果需要跨数据库怎么办? 比如我的账号存在数据库A,  你的账号在数据库B, 那转账的时候怎么办? 怎么实现什么ACID ? ”

InputStream表示不同意: “谁会这么傻, 把我们的账号信息放到两个数据库当中? ”

“这就是时候未到, 现在大部分的应用数据量都不大, 放到一个数据库中绰绰有余,等到数据量大到一定程度,势必要拆分数据库,就会出现跨数据库的事务, 到那个时候我们的机会就来了, 我们准备好解决方案, 参那厮一本, 不信扳不倒他!”

IO大臣拍板: “好! 就这么办, 这事离不开数联酋(数据库联合酋长国)的支持,我和他们还有交情, 这就派人去,许以重金, 让他们继续和我们合作。”

在IO大臣密谋的同时, JDBC大臣的家中却是觥筹交错、莺歌燕舞。

有识之士如Connection 曾经向JDBC大臣提醒过要和数联酋搞好关系, 以便将来有什么不时之需。 可是处于巅峰的JDBC大臣哪能听得进去?

3

  两阶段提交

InputReader 果然很有远见, 随着时间的流逝, Web越来越发达, 帝国出现了很多巨型网站, 他们的各种数据果然是没法放到一个数据库中了,把大的业务系统查分成多个数据库势在必行, 当一个业务同时操作多个数据库的时候, 没有分布式事务是做不了的。

正在此时,一个秘密奏章被送到了国王的案头, 状告JDBC大臣因循守旧,面对大好的形式不与时俱进,对分布式事务漠不关心,毫无作为。

国王召集朝会,讨论分布式事务的问题, 他向JDBC大臣率先发难: “爱卿, 你听说过臣民们要求支持分布式事务吗?”

JDBC大臣慌了: “这。。。 这好像是一撮刁民提的要求吧, 陛下不用理会。”

IO大臣冷笑一声:“刁民? 我看是良民吧 !  启奏陛下, 据臣所知,帝国有不下百个系统要求支持分布式事务,JDBC大臣竟然连最基本的情况都不知道, 真是毫无作为。”

IO大臣觉得稳操胜券,直接撕破了脸。

国王心里明白了几分, 他直接对IO大臣说: “爱卿,你说说该怎么办?”

“陛下,当年臣和数据库联合酋长国谈判的时候, 和他们建立了良好的交情。 前几天我宴请他们的时候,特别提及了这件事情。 Oracle 告诉臣,这很好办, 人家别的王国正在讨论实施两阶段提交的协议, 我们也可以参与进来。”

虽然IO大臣已经和数据库联合酋长国讨价还价了很久, 不知道花费了多少金钱,但还是不显山不漏水、很随意地说了出来。

JDBC大臣一看IO大臣进入了自己的一亩三分地, 急忙问道: 什么是两阶段提交?

IO大臣不屑地瞥了他一眼, 从袖子中拿出早就准备好的提议,双手向国王奉上。

国王哪里看得懂,扫了一眼就赐给望眼欲穿的JDBC大臣, 只见上面赫然写着:

两阶段提交协议

由于涉及到多个分布式的数据库, 我们特设一个全局的事务管理器,它来负责协调各个数据库的事务提交, 为了实现分布式事务,特设两个阶段:

阶段1: 全局的事务管理器向各个数据库发出准备消息。 各个数据库需要在本地把一切都准备好,执行操作,锁住资源, 记录redo/undo 日志, 但是并不提交, 总而言之,要进入一个时刻准备提交或回滚的状态, 然后向全局事务管理器报告是否准备好了。

阶段2: 如果所有的数据库都报告说准备好了, 那全局的事务管理器就下命令: 提交, 这时候各个数据库才真正提交 , 由于之前已经万事具备,只欠东风,只需要快速完成本地提交即可;

如果有任何一个数据库报告说没准备好, 事务管理器就下命令: 放弃, 这时候各个数据库要执行回滚操作, 并且释放各种在阶段1锁住的资源。

0?wx_fmt=png

JDBC大臣也是行家,一看就明白了是怎么回事。阶段1就是让大家都准备好,阶段2就是迅速提交。

这是一个看起来很美的理想方案,但是他意识到其中有漏洞,自己的幕僚曾经告诫过:一旦涉及到分布式,事情就不会那么简单,任何地方都有失败的可能。

比如在第二阶段,那个事务管理器要是出了问题怎么办? 人家各个数据库还在等着你发命令呢? 你迟迟不发命令,大家都阻塞在那里,不知所措,到底是提交呢?还是不提交呢, 我这里还锁着资源呢, 迟迟不能释放,多耽误事啊 ! 

还是第二阶段,事务管理器发出的提交命令由于网络问题,数据库1收到了,数据库2没收到,这两个数据库就处于不一致状态了, 该怎么处理?

JDBC大臣决心给IO大臣挖个坑:让你逞能 ! 让你给老子穿小鞋! 

他说:“ 陛下,IO大臣不愧为设计过JDBC协议的股肱之臣, 臣才学疏浅,深为拜服,特奏请陛下恩准IO大臣再次出山和数据库联合酋长国设计出新协议, 来支持分布式事务。”


国王准奏。

4

  JTA

IO大臣满心狐疑, 不知道JDBC老头儿在给自己下什么药,回到府中和大家商量。

InputReader 眼看自己多年前的计策就要成功,颇为兴奋: “管它呢, 只要咱们把这个分布式事务的协议给制定好,JDBC老儿就得下台了。”

“对,到时候我们就掌管文件, 网络,数据库,Java 帝国就是我们IO独大了”  InputStream 开始畅想美好的未来,到时候自己估计至少从5品升为4品。

IO大臣马上安排和数据库联合酋长国的谈判,由于之前良好的交情。 这一次协议很容易就达成了, IO大臣给他起了一个很响亮的名字: Java Transaction API (简称JTA)。

这个JTA规范用起来也比较简单, 只要获得一个UserTransaction 就可以操作了,帝国的臣民们根本不用关系底层的协议细节:

0?wx_fmt=png

经过国王的批准, JTA正式推广。

可是令IO大臣万万没有想到的是, 国王在JTA发布的前夕, 亲切地召见了自己和另外一个不知名的官员, 国王关心地说:“爱卿,朕知道你很忙,掌管着网络和文件操作,为了给你减轻负担,朕决定任命一个新的JTA大臣来协助你!”

IO大臣如同五雷轰顶,自己辛辛苦苦的工作完全被无视, 这到底是为什么?

他失魂落魄地回到府中, 好几天茶饭不思。

还是InputReader 出来安慰了他: “这是陛下的帝王之术, 害怕我们一家坐大, 平衡了一下朝中力量。大人可以放宽心, 你看JDBC大臣也受到了打压,风光不再了。”

5

 塞翁失马,焉知非福

JTA并没有取得像JDBC那样的广泛应用, JDBC大臣挖的那个坑现在终于露出了狰狞的面目。

只不过这个坑并没有让IO大臣掉进去, 新任的JTA大臣背了黑锅。

臣民的抗议声越来越多: 分布式事务伴随着大量节点的通信交换, 协调者要确定其他节点是否完成, 加上网络带来的超时,导致JTA性能低下, 在高并发和高性能的场景下举步维艰。

拜IO大臣的工作所赐,  现在数据库联合酋长国的各个部落都支持两阶段提交,很多应用服务器Websphere , Weblogic 等都支持JTA, 可是使用者确是寥寥无几, 都快成摆设了。

JTA大臣每次上朝都战战兢兢, 他是个平庸之辈,虽然四处救火,但是无力解决根本的问题。

现在那些高并发的系统反而极力避免两阶段提交, 他们绕开JTA大臣, 直接找到了IO大臣诉苦:“大人,你带领着制定了JTA, 但是这个标准太理想化,完全不符合实情啊! ”

IO大臣说: “不会吧,这不是你们要求的吗, 用户A和B的账号分别在两个数据库, 当A给B转账100块的时候, 肯定得保证A扣掉100, 然后B增加100啊。”

“这就是官府的想法, 总是想着让两个数据库保证实时的一致性(强一致性), 为了达到这个目标,JTA付出的代价太高了。 我们现在不想这么干了。 我们可以忍受一段时间的不一致,只有最终一致就行。 比方说A给B转100元, A 中的钱已经扣除, 但是B中不会实时地增加,过段时间能保证增加就行了”

“最终一致性? 有点意思!”   ,想到Java 帝国的官方标准总是被臣民们所建立的事实标准所打败,敏锐的IO大臣立刻看到了背后的机遇, 他决定这一次要联合民间力量,再次反攻, 一举搞掉JDBC大臣和JTA大臣。

想到这里, IO大臣得意地笑了......

(未完待续)

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华》

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


码农翻身

用故事讲述技术

0.jpeg

Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar 立即下载

相关推荐

AD9176 双通道高速DAC调试记录

AD9176是一款高性能双通道16位数模转换器,支持高达12.6GSPS采样率,专为多频段无线应用设计。该器件集成8通道15.4Gbps JESD204B接口,支持复数/实数数据输入,每通道最大输入速率达3.08GSPS。关键特性包括:48位高精度NCO、灵活的插值滤波器(最高12倍)、优异的动态性能(SFDR达-83dBc@1.84GHz)以及多芯片同步功能。硬件调试需重点关注时钟配置(建议250M基准时钟)、JESD参数匹配及交流耦合设计。测试指标要求SFDR>55dBc@312MHz,实测值可达65d

universaldata的博客 1493

Java-Jackson使用详解

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

jcc4261的博客 1749

基于STM32F407的DDS信号源设计与实现:DAC+DMA+TIM的高精度波形生成

本文详细介绍了基于STM32F407微控制器实现高精度DDS信号源的完整方案。通过结合DAC、DMA和TIM外设,并运用DDS算法,实现了分辨率高达0.001Hz的波形生成。文章深入剖析了相位累加器、波表查表等核心原理,提供了从CubeMX配置到代码实战的完整指南,并探讨了性能优化与高频输出问题的解决方案。

weixin_29193259的博客 504

java中的jackson_Java中Jackson快速入门

Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的Jackson等高级类库处理起来会方便很多。引入类库由于Jackson相关类库按照功能分为几个相对独立的,所以需要同时引入多个类库,为了方便我将版本号单独提取出来设置,相关Gradle配置如下。ext {jacksonVersion = '...

weixin_39546092的博客 794

张量/数组存储方式与向量化展开/展平、view、reshape、permute对比

对于一个Tensor来说,我们可以认为它有两种存储方式。

欢迎关注,共同进步! 3435

Mid-360与FAST-LIO2实战:从点云采集到高精度建图全流程解析

本文详细解析了使用Livox Mid-360激光雷达与FAST-LIO2算法实现高精度实时建图的全流程。内容涵盖硬件准备、软件环境搭建、算法部署配置、数据采集实战,并重点探讨了多楼层场景下的参数调优与误差抑制策略,为机器人及无人机三维感知应用提供了实用指南。

prometheus9mon的博客 416

Java使用jackson操作Json格式数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,她是 JavaScript原生态的数据格式。她独立于任何编程语言、可读性高、易于生成和解析、体积轻量,这些优雅的特性,让JSON成为非常理想的数据交换的语言。原文地址: http://www.hpboys.com/616.html在使用Java操作JSON时,我们用到了Jackson框架。Jackson可...

隐居者 862

全新YOLO26有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

🔥《2026年YOLO26改进专栏》🔥 🚀持续更新500+最前沿创新改进点(顶会顶刊论文/独家创新策略),涵盖主干网络、各种卷积、注意力机制、检测头等模块,助力科研论文发表与模型性能提升,支持检测/分割/分类任务。订阅即获完整可运行项目,提供专业QQ答疑群,适合科研发论文(SCI/CCF/核心)及工业应用(PCB/医学/遥感检测)。专栏价格将逐步上涨,早订更优惠! ⭐特色:非计算机专业友好、模块可自由组合、全网独家创新;📌适用:研究生大论文和小论文创新、小目标检测、多领域科研应用,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 5174

Java帝国的诞生以及Java的一些简单介绍

Java帝国的诞生以及Java的一些简单介绍

yujiyai的博客 190

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7172

构建AI Agent驱动的智能健康管理系统

数据碎片化:健康数据分散在不同的设备和平台中,难以统一管理和分析。个性化不足:健康管理方案通常是通用的,难以根据个人的健康状况实时调整。用户参与度低:用户难以获得及时、个性化的健康建议,导致健康管理效果不佳。AI Agent是一个能够感知环境、采取行动以实现目标的智能实体。根据智能体的智能水平,可以分为简单反应式智能体和复杂适应式智能体。实时监测健康数据。获取个性化的健康建议。收到健康风险预警。

AI天才研究院 749

Debug Assertion Failed 问题怎么解决

Debug Assertion Failed 问题怎么解决

qq_43680117的博客 2603

Loop Engineering 来了:从写 Prompt 到设计 Loop,AI 编程的第四次范式跃迁

文章摘要: Loop Engineering是AI编程领域的新范式,标志着从"人手动喂指令"到"设计自驱动循环"的跃迁。其核心在于通过五个组件(定时器、工作空间、知识体系、连接器和子Agent验证)构建自动化任务流,使AI系统能自主运行。这一概念的火爆源于模型能力和工具链的成熟,使得任务设计成为关键瓶颈。作者指出,从Prompt到Loop的四次范式跃迁(语言学→信息科学→控制论→管理学)反映了人机协作关系的根本变化:人类角色从执行者逐渐退居为目标设定者。落地Loop Engineering的真正挑战在于目标

少说,多做 334

ActiveX Debug Assertion Failed

新建的 ActiveX 控件工程,就算什么代码都不写进去,在连接时也会出现这样的问题;忽略断言错误继续下去,在Debug下生成了 .ocx文件,直接在运行对话框里输入: regsvr32 D:\ActiveX\debug\XXX.ocx (路径对的)也会出现同样的断言错误,不能注册;根据断言提示的错误去查找相关的错误 发现是红色部分的断言: void CCmdTarget::EnableType

小_鱼的专栏 1147

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Debug Assertion Failed!

原文地址:  Assertion   Failed!" style="text-decoration:none; color:rgb(34,85,15)">Debug   Assertion   Failed!作者:一廉幽梦   VC++调程序出现如下错误:   Debug   Assertion   Failed!        Program:   D:wyuStuddebu

susandebug 1239

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

解决导出的MFC扩展动态库在调用时出现Debug Assertion Failed错误的问题

<br /><br /><br />导出一个从CView继承的类MapView,新建一个单文档工程,将里面视图类的基类改为MapView类,debug模式下运行出现如下错误(导出MapView类的动态库是Release版本),点击忽略系统可正常运行,将导出MapView类的动态库编译为Debug版本,系统正常运行,debug模式下系统正常运行但是release模式下会出问题。<br /><br /><br />原来导出动态库的方式如下:<br />#ifndef _BLUEMAP_MAPVIEW_<br /

李金的专栏 7189

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

debug assertion failed是什么意思?_VS Code 开源新工具:实时可视化Debug:

本文转自公众号:机器之心(almosthuman2014)参与:思、jaminDeBug 太枯燥?让 VS Code 画个图,自动帮你理清数据结构与代码思路,这就是 Reddit 2K 多点赞的开源新工具。项目地址:https://github.com/hediet/vscode-debug-visualizer写代码,难免会遇到各种神奇的问题,代码短我们在脑海中「运行」一遍也就差不多...

weixin_39704971的博客 829

Debug Assertion Failed解决方法! !!

VC++调程序出现如下错误:   Debug   Assertion   Failed!        Program:   D:\wyuStud\debug\wyuStud.exe      File:   afx.inl            Line:157      可能问题:1.野指针;2.内存泄露   解决方法:   1.看一看你的程序里是不是有ASSERT()或VERI

2万+

MFC学习笔记之VC++ Debug Assertion Failed 错误(File: strex.cpp Line: 690)

转载:VC++DebugAssertionFailed!错误(File:strex.cppLine:690)_希热明玛_新浪博客 问题(File: strex.cpp Line: 690): 错误描述:在Debug模式下报错,Release模式下正常。 --------------------------- Microsoft Visual C++ Debug Library --------------------------- Debug Assertion Failed! Progra...

汉尼拔勇闯天涯 4737

Debug Assertion Failed!【hlp】

vs2008中调试一个多目标跟踪程序的时候,遇到过此问题,在release下回忽略此问题,在release版本下不用关心这个问题,也就是系统帮你给屏蔽了,但是问题还是存在的,在debug环境下,报这样的错误。 错误原因: 这段代码本来没错,错在平台上。 nm.cbSize = sizeof (NONCLIENTMETRICS) ; 这个是低版本,通常所说的0x0501

STELLAR0的专栏 1982

Debug Assertion Failed解决思路

Debug   Assertion   Failed!  (2011-01-10 10:55:03) 转载▼ 标签:  指针变量   函数   程序   调用   小错   it 分类: VC++错误集锦   VC++调程序出现如下错误:   Debug   Assertion  

贰零零玖 1400

oveWindow下出现Debug Assertion Failed!

MoveWindow下出现Debug Assertion Failed!----例2_55备注 效果图: 代码: --------------------------------------------------- 问题为什么出现? 第1步:明确是哪种调试!-----------分2种:1.Debug 2.Release       在Releas

gaodr1989的专栏 1034

Debug Assertion Failed!

VC++调程序出现如下错误: DebugAssertionFailed!Program:D:\wyuStud\debug\wyuStud.exeFile:afx.inlLine:157 可能问题:1.野指针;2.内存泄露解决方法: 1.看一看你的程序里是不是有ASSERT(...

weixin_33921089的博客 484
上一篇: 每个人都应该了解的金融小知识 -- 利率计算
下一篇: Java帝国之宫廷内斗(2)
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值