日常Bug排查-应用Commit报错事务并没有回滚
日常Bug排查-应用Commit报错事务并没有回滚
前言
日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_。
应用Commit报错并不一定回滚
事实上,这篇文章并没有什么排查过程。但这个问题却又是笔者经常遇到的。
笔者仅仅是想阐述一下当我们在事务Commit报错时候,数据库中的数据并不一定会是我们以为的回滚状态。笔者举个例子:

在这种情况下,很明显的DB的数据肯定是处于已经提交的状态。而如果App认为是回滚状态,并基于这个信息去做操作的话,很明显会导致数据不一致。
非IO or 超时异常 也不一定回滚
可能有人会问了,是不是仅仅是IO异常或者超时异常才会出现这种不一定回滚的问题呢?这里还真不一定,笔者在一次Case中,就发现Oracle在commit的时候返回死锁异常时候,数据库内部的commit竟然也成功了!这就牵涉到数据库内部的处理了。
应用应该怎么做呢?
事实上,由于数据库保证了原子性。所以我们在遇到这种情况时候,需要从数据库中重建状态,而不是依赖现在应用里面的信息。所以遇到异常直接将流程结束,然后等定时任务等补单操作是个比较简单安全的做法。
当然,数据库中重建状态时候,也要考虑到上一个相应的commit还在commit的过程中,只不过这个commit非常慢而已。由于我们更新数据或者最终判断的时候往往会锁住数据,而数据库一般都是采用了二阶段锁(S2PL)。

在上一个commit成功提交之后,我们对相应数据的操作才会执行下去。所以只要小心的控制好锁的范围,数据一致性还是能保证的。
总结
Commit报错但事务并没有回滚,这个虽然有点反直觉,但这确是在产线真实存在的,尤其在数据库压力大的时候极易出现。这个坑在我们编写代码的时候需要牢记!

日常Bug排查-应用Commit报错事务并没有回滚的更多相关文章
- @transactional注解,报错后数据库操作回滚失败
1. https://jingyan.baidu.com/article/3a2f7c2e27d51b26afd611ff.html 2. https://blog.csdn.net/lee_star ...
- 日常Bug排查-抛异常不回滚
日常Bug排查-抛异常不回滚 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 最近有人反映java应用操作数据库的时候,抛异 ...
- docker run、commit报错
1.docker commit 报错 Error response from daemon: devmapper: Error mounting '/dev/mapper/docker-253:2-1 ...
- 日常Bug排查-系统失去响应-Redis使用不当
日常Bug排查-系统失去响应-Redis使用不当 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 开发反应线上系统出现失去响 ...
- 日常Bug排查-消息不消费
日常Bug排查-消息不消费 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 某天下午,在笔者研究某个问题正high的时候.开 ...
- 日常Bug排查-Nginx重复请求?
日常Bug排查-Nginx重复请求? 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,其中不乏一些看起来很低级但很容易犯的问题. 问题现场 有一天运维突然找到 ...
- Git系列 -> git commit 报错 “Invalid syntax in configuration ini file.”
git commit 报错 提示信息为 "Invalid syntax in configuration ini file." 解决办法: 方法一:使用-n or --no-ver ...
- nestd事务如果报错了 则回滚到外部事物保存点 且外部事物如果没异常的话 会正常提交 nested事务并不会提交;如果外部事物报错了 内部事务会一同回滚
nestd事务如果报错了 则回滚到外部事物保存点 且外部事物如果没异常的话 会正常提交 nested事务并不会提交:如果外部事物报错了 内部事务会一同回滚
- SSM保姆级从创建项目到使用,包括事务和设置回滚
1. 简介 Spring 和 Mybaits整合 2. 创建项目 负责将代理类记性扫描,扫描的是Mapper接口所在的包,这个是mybatis提供的,所以会去找SqlSessionFactory 2. ...
- Spring事务控制和回滚
1在一个项目中ssh结构,spring2.5,事务控制采用的是tx拦截器的方式. 自己写了个 int a=1/0;异常抛出了,但是事务还是提交了,怎么搞都不行. 现将看到的一些事务控制总结下来: 事务 ...
随机推荐
- 【源码解读(一)】EFCORE源码解读之创建DBContext查询拦截
引言 在网上很少看到有关于系统讲解EFCore源码的,可能大概也许是因为EFCore的源码总体是没有asp.net web的源码流程清晰,正如群友所说,EFCore的源码大致看起来有点凌乱,与其说凌乱 ...
- OpenResty入门之压测篇:压测工具界的 “悍马” wrk 审核中
在上篇文章 每个后端都应该了解的 OpenResty 入门以及网关安全实战 中,我向大家介绍了 OpenResty 的入门使用是 WAF 防御实战,这篇文章将给大家继续介绍 OpenResty 入门之 ...
- 揭秘计算机指令执行的神秘过程:CPU内部的绝密操作
计算机指令 从软件工程师的角度来看,CPU是执行计算机指令的逻辑机器.计算机指令可以看作是CPU能够理解的语言,也称为机器语言. 不同的CPU能理解的语言不同.例如,个人电脑使用Intel的CPU,苹 ...
- 关于Windows打印机驱动相关问题-如何利用Java(或其他)调用打印机驱动程序完成原始文件翻译为PCL语言的步骤
前面这些都是问题描述,问题在偏下面 场景:用户电脑上安装了PCL驱动,可通过驱动完成打印. 需求:现在需要提供一种脱离PC端完成文件上传并打印的功能.让用户使用手机或pc未安装驱动时都能打印文件. 目 ...
- JUC并发编程学习笔记(四)8锁现象
8锁现象 八锁->就是关于锁的八个问题 锁是什么,如何判断锁的是谁 对象.class模板 深刻理解锁 锁的东西无外乎就两样:1.同步方法的调用者,2.Class模板. 同一个锁中,只有当前线程资 ...
- "拍牌神器"是怎样炼成的(二)--- 键鼠模拟之AutoIt
不同于上一篇的WinAPI方法,这次让我们来看另一个更简单.有效的键鼠模拟方案,即通过COM组件AutoItX实现键鼠模拟. AutoIt AutoIt是一个免费软件,它使用一种类似BASIC的脚本语 ...
- C/C++ __builtin 超实用位运算函数总结
以 __builtin 开头的函数,是一种相当神奇的位运算函数,下面本人盘点了一下这些以 __builtin 开头的函数,希望可以帮到大家. 1 __builtin_ctz( ) / __buitli ...
- 实现MyBatisPlus自定义sql注入器
目标:新增mysql下的 插入更新的语法 INSERT INTO %s %s VALUES %s ON DUPLICATE KEY UPDATE %s 新增方法类,新增的方法名称为insertOrUp ...
- C语言【编译器、变量、输入输出有关的】
C语言[编译器.变量.输入输出有关的] 一些想到的[从编译器到变量到输入输出有关的]的问题,有些是按自己理解写的答,有些待解决. C语言可以跨平台,汇编不可以,编译时C语言会根据不同系统翻译成不同形式 ...
- keepass