tb_0030出现违反唯一性约束的问题_违反表的唯一约束性try catch-程序员宅基地

技术标签: 问题处理  

tb_0030是SEMQ的待确认消息表,存储已接收但等待发送方确认已送达的记录,f003v_0030是确认记录键,可以唯一对应到系统范围内的所有SEMQ实例中的待发送记录.

f003v_0030由节点类型,节点id,SEMQ实例id,SEMQ存储id,记录编号组成.

tb_0030在f003v_0030上建立唯一索引.可以提高定位速度.

 

运行过程中出现了重复insert导致违反约束的情况.---虽然不会造成逻辑错误,但浪费了资源.

检查代码发现,在处理接收到的消息时,检查是否已经接收过此消息,即使判定已经接收过,仍先执行insert,出错后检查是否是违反唯一性约束,是则通过f003v_0030定位该记录,获取记录id,该记录id会出现在发送方处理确认消息后的再确认消息中.再确认的目的是告诉接收方"我知道已经送达了",这时才可以安全地清理tb_0030的记录.

 

消除此错误的代码修改如下:(已修改gyb trunk和das)

(1)semq.h  

SaveAck增加dont_save参数,表示是否保存,如不保存则直接查询待确认记录.

class CSEMQ  : public ISEMQ,public IEventHandler,ACE_Event_Handler {  

public:
   static int SaveAck(SEMQ_ACK_HELPER *ak,short dont_save=0); 
 }
  
(2)semq.cpp   
int CSEMQ::SaveAck(SEMQ_ACK_HELPER *ak,short dont_save) {
 USEDBC(pdbor,ack_queue_dbc_.c_str());

 ITableHandler *th = CBasePlugInModule::db_helper_->NewTableHandler(pdbor,"tb_0030");
 AUTO_POINTER_NODECLARE(ITableHandler,th);

 pdbor->BeginTrans();
 unsigned short num = ak->loc_keys_.size();
 for (unsigned short i=0;i<num;i++) {
  MQ_LOC_KEY *lk = ak->loc_keys_[i];
  char key[128];
  sprintf(key,"%d,%d,%d,%d,%I64d",lk->node_type_,lk->node_id_,lk->mq_id_,lk->mq_db_id_,lk->record_id_);
  unsigned __int64 record_id;
  bool dup_key_error = false;

  if (!dont_save) {
   th->BindField("f003v_0030",key);
   char date[32];
   CDateTime::GetDateTime(date);
   th->BindField("src_type",(char**)&ak->src_.type_,sizeof(ak->src_.type_));
   th->BindField("src_id",(char**)&ak->src_.id_,sizeof(ak->src_.id_));
   th->BindField("dest_type",(char**)&ak->dest_.type_,sizeof(ak->dest_.type_));
   th->BindField("dest_id",(char**)&ak->dest_.id_,sizeof(ak->dest_.id_));
   th->BindField("f005d_0030",date);
   if (th->Insert()) {
    dup_key_error = pdbor->GetDBExt()->IsDuplicateKeyError(pdbor->GetLastErrorCode());
    if (!dup_key_error) {
     return -1;
    }
   }

   if (!dup_key_error) {
    if (pdbor->GetDBExt()->GetLastID(record_id,1,"tb_0030")) {
     return -2;
    }
   }
  }
  if (dont_save||dup_key_error) {
   string sql = LogMsg("select object_id from tb_0030 where f003v_0030='%s'",key);
   _variant_t v;
   if (QueryValue(pdbor,sql.c_str(),&v)) {
    return -3;
   }
   string sVal = ExVariantToString(v);
   record_id = a2Li(sVal.c_str());
  }
  ak->src_record_ids_.push_back(record_id); ///< 保存写入的待确认记录的记录编号
 }
 FAIL_RETURN(pdbor->CommitTrans(),,-1);

 return 0;
}
  
(3)router.cpp  
int CBBoxPlugin::HandleInput(CWrappedMsg<> *pwm,void **pploc,int &action)  {
 int ret = -1;
 try {
  CMsg *msg = pwm->GetMsg();
  bool do_ack = msg->IsAutoAck(); ///< 包含msg->IsAck2
  ret = HandleInput_i(pwm,pploc,action);
  nlogger_->log(LO_STDOUT|LO_FILE,SEVERITY_DEBUG,"************CBBoxPlugin::HandleInput_i()返回%d.\n",ret);
  /// ret: 0-交给插件处理 其它值:错误 (<0)或者转发(>0)
  SEMQ_ACK_HELPER *ah = (SEMQ_ACK_HELPER*)*pploc;
  if (action&&do_ack) {
   if (action==-1)
    semq_.Ack(ah,1);
   else {
    if (semq_.SaveAck(ah,action==3 ? 1:0)==0)
     semq_.Ack(ah,0);
   }
  }
  if (ret) { /// ret==0表示交给插件处理,其它值时释放ah对象
   if (ah) {
    delete ah;
    *pploc = 0;
   }
  }
 } catch(...) {
  nlogger_->log(LO_STDOUT|LO_FILE,SEVERITY_ERROR,"************CBBoxPlugin::HandleInput()异常.\n");
 }

 return ret;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wherwh/article/details/41848369

智能推荐

python overflowerror_python – 是否真的引发了OverflowError?-程序员宅基地

文章浏览阅读520次。Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34)[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> float(1...

详解SwiftUI数据流是怎么在View间传递的_ios 怎么把swiftui事件传到uiview里-程序员宅基地

文章浏览阅读1.9k次。作为一个声明式的UI框架,SwiftUI帮我们处理了几乎所有关于UI和数据之间的交互,这使我们不再需要关注数据变化时刷新UI和用户交互以后更新数据的逻辑。为了实现数据和UI的绑定,我们需要利用Swift的一些关属性包装器来向SwiftUI描述它们之间的关系,那么让我们开始吧。到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相关内容。State Properties @State在前面的一篇文章中当我们给数组添加或者删除元素时,列表会自动响应变化,正是因为使用了@State._ios 怎么把swiftui事件传到uiview里

1-8 linux系统中的软件管理-程序员宅基地

文章浏览阅读99次。#### 1.Linux中软件包的类型 ####1.DEB#UBlinux DEBlinux2.RPM #redhat centOS fadora3.bz2|gz|xz#1.需要源码安装需要编译 #2.绿色软件,直接可用 #ntfs-3g_ntfsprogs-2017.3.23.tgz需要编译 "configur...

基于动态用户偏好和服务质量的推荐算法-程序员宅基地

文章浏览阅读4.9k次。引用:Zhang Y, Qian Y, Wang Y. A RecommendationAlgorithm Based on Dynamic User Preference and Service Quality[C]//2018 IEEEInternational Conference on Web Services (ICWS). IEEE, 2018: 91-98.摘要:在服务计算领域...

python二级考试选择题公共基础知识_计算机二级选择题(公共基础知识)-程序员宅基地

文章浏览阅读1.9k次。在这一期的文章主要以计算机二级选择题的公共基础知识进行讲解。在计算机二级考试当中,选择题中的二级公共基础知识是必考的部分。很多考生对计算机二级的公共基础知识选择题有很多不解。二级公共基础知识选择题主要考这些内容。未来教育题库界面截图主要由四章内容组成:数据库结构与算法、程序设计基础、软件工程基础、数据库设计基础一、数据库结构与算法这一章主要难点是对栈与队列以及树与二叉树的理解。话不多说,,直接上例..._计算机二级python公共基础题选择题是什么

VS2013 修改TFS的本地映射路径-程序员宅基地

文章浏览阅读2.2k次。在源代码管理器里面 找到你的本地工作区然后点击编辑按钮修改本地目录_vs怎么更改映射路径

随便推点

Android面试官,面试时总喜欢挖基础坑,整理了26道面试题牢固你基础!(3)-程序员宅基地

文章浏览阅读795次,点赞20次,收藏15次。AIDL是使用bind机制来工作。java原生参数Stringparcelablelist & map 元素 需要支持AIDL其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

机器学习-数学基础02补充_李孟_新浪博客-程序员宅基地

文章浏览阅读248次。承接:数据基础02

短沟道效应 & 窄宽度效应 short channel effects & narrow width effects-程序员宅基地

文章浏览阅读2.8w次,点赞14次,收藏88次。文章目录1. 概念:Narrow Width Effect: 窄宽度效应Short Channel effects:短沟道效应阈值电压 (Threshold voltage)2. 阈值电压与沟道长和沟道宽的关系:Narrow channel 窄沟的分析Short channel 短沟的分析1. 概念:Narrow Width Effect: 窄宽度效应在CMOS器件工艺中,器件的阈值电压Vth 随着沟道宽度的变窄而增大,即窄宽度效应;目前,由于浅沟道隔离工艺的应用,器件的阈值电压 Vth 随着沟道宽度_短沟道效应

小米组织架构再调整,王川调职,雷军自任中国区总裁_小米更换硬件负责人-程序员宅基地

文章浏览阅读335次。5月17日,小米集团再发组织架构调整及任命通知。新通知主要内容为前小米中国区负责人王川调职,雷军自任中国区总裁。小米频繁调整背后,雷军有些着急了中国区手机业务持续下滑。根据IDC最近公布的数据,小米一季度全球出货量为2750万台,相比去年同期的2780万台,小幅下降。参考Canalys、Counterpoint的统计,小米一季度出货量也都录得1%的同比下滑。作为对比,IDC数据显示,华为同期出..._小米更换硬件负责人

JAVA基础学习大全(笔记)_java学习笔记word-程序员宅基地

文章浏览阅读9.1w次。JAVASE和JAVAEE的区别JDK的安装路径[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-perPRPgq-1608641067105)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201222001641906.png)]卸载和安装JDK[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYnXvbAn-1608641067107)(C:\Users_java学习笔记word

vue-echarts饼图/柱状图点击事件_echarts 饼图点击事件-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏17次。在实际的项目开发中,我们通常会用到Echarts来对数据进行展示,有时候需要用到Echarts的点击事件,增加系统的交互性,一般是点击Echarts图像的具体项来跳转路由并携带参数,当然也可以根据具体需求来做其他的业务逻辑。下面就Echarts图表的点击事件进行实现,文章省略了Echarts图的html代码,构建过程,option,适用的表格有饼图、柱状图、折线图。如果在实现过程中,遇到困难或者有说明好的建议,欢迎留言提问。_echarts 饼图点击事件

推荐文章

热门文章

相关标签