MongoDB事务最大限制大小

记录一次MongoDB的事务处理

事件原因

MongoDB在4.0开始引进事务,因业务的某个场景需要用到MongoDB的事务操作,但在某次线上的某一条数据在修改时一直报`org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 112 (WriteConflict): ‘WriteConflict’

WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction.,`

是否发生了写冲突?

因为MongoDB采用的是悲观事务,会校验是否发生冲突,原来以为可能是同时操作了同一文档,spring-data-mongodb是没有任何重试操作的,直接把异常抛出来,所以引入了retry操作,但是发现没用,经排查,在操作固定文档的时候必会出现此异常,且不可能出现写冲突,故排除写锁导致的异常。

确定是事务异常?

后来尝试把事务操作去除,该异常便不会出现在异常发生的环境,后来在测试环境尝试测试此问题,发现竟然一直没有重现!!!

对比两侧环境差异

通过对事务两侧配置的比较,发现没有任何区别,最后想了一下,会不会两侧的MongoDB版本不一致导致的,最后发现果然是!!!发生异常环境为4.4版本,测试环境为4.2,然后就去找两个版本的MongoDB事务相关的差异了,最后发现是oplog的产生策略发生了差异,4.2时事务里每个写操作都会产生一个oplog,而4.4中一个事务操作会产生一个oplog,而oplog的限制就是一个document的最大显示大小16M!!!

为啥我一个事务操作的大小超过了16M?

上面招到了其实是因为一个事务操作产生的oplog大小超过了限制值,但是为啥我的一个事务操作会这么大???后来派擦汗数据发现,一部分老数据图片竟然用的base64???OMG,集中把base64老数据换成URL,问题解决。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值