非事务性操作在多线程下带来的坑
来源:互联网 发布:手机开淘宝店视频教程 编辑:程序博客网 时间:2024/05/18 06:26
案情重演:
先从一张时序图开始
首先有两个系统A、B,他们之前用ActiveMQ作为交互。为了记录上面的执行情况,在数据库中有一个字段来标识执行到哪一步的状态,状态说明如下:
1: 插入数据库时的初始状态,即第1步完成后的状态
2: 推送ActiveMQ成功后的状态,也就是第2步完成后的状态
3: 处理结果成功的状态,也就是第6步完成后的状态【最终状态,下面会提到。】
正常来说从步骤1到步骤6都不会有任何问题,但并发量稍微大的时候,最终状态是2而不是3。
而日志打出来的结果已经更新成功,郁闷中,难道是数据库更新的问题?
后来在步骤6的更新数据库前,先查询该条记录判断状态是否为2。 然后下断点,调试,发现此时2的更新数据库操作未完成。
原因分析:
首先,推送MQ成功时并不代表已经处理完毕。
然后,当并发量达到一定程度时,MySQL需要处理大量的update操作,可能造成一定的延迟,
而且是多线程环境,步骤6由专门的线程来执行,跟步骤2实际上是并行的关系。
此时如果处理结果返回时,可能会在步骤2未能执行完毕的情况下执行步骤6成功,然后步骤2
的更新数据库操作会将本就是最终状态的记录变成步骤2完成的状态。
解决方案:
在第6步的更新数据库前先判断步骤2的数据库更新操作是否成功即可。
0 0
- 非事务性操作在多线程下带来的坑
- msyql 触发程序在处理事务性和非事务性表的区别
- 在多线程中,recv非阻塞模式带来的问题
- 数据库事务性操作
- 多线程带来的风险
- Lucene的事务性
- 多线程下非阻塞堆栈的实现
- mysql二进制日志处理事务和非事务性语句的区别
- WebBrowser多线程带来的麻烦
- WebBrowser多线程带来的麻烦 .
- 多线程带来的数据不一致
- MySQL记录非事务性语句-疑问
- 如何保证WebService的事务性
- 查看mysql表的事务性
- Zookeeper对于事务性的支持
- 非“开放性产品”带来的痛苦
- C# 多线程与异步操作实现的探讨(非原创)
- 测试AtomicInteger与普通int值在多线程下的递增操作
- Android Preference详解之初识Preference及Preference系(一)
- Android适配(屏幕适配、国际化适配)
- mysql源码安装
- 缓冲区溢出原理及教学版攻击演示
- rman理论(一)
- 非事务性操作在多线程下带来的坑
- 《JAVA设计模式》:策略模式
- 第一篇文章
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
- Qt Creator 你必须要掌握的快捷操作
- R语言针对txt文本的词云做法
- #!/usr/bin/env python与#!/usr/bin/python的区别
- iOS 【极光推送】第一次打开app,收不到推送消息
- Android平台下加载PDF文件方案解析