解决mongodb transaction WriteConflict问题

最近在项目尝试使用Mongodb的事务特性
发现遇到了一个坑org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 112 (WriteConflict): 'WriteConflict'
在并发操作同一个文档的时候,有概率会出现上面这个提示
然后在重试之后就会没有

分析

经过查询资料,发现上面的问题是由一个参数引起的maxTransactionLockRequestTimeoutMillis
这参数是事务锁最大等待事件(毫秒)官网链接(maxTransactionLockRequestTimeoutMillis)
这个参数默认值为5(毫秒),也就意味着获取锁超出了这个时间就会提示WriteConflict

解决

方式一:使用这个可以在线修改这个值

db.adminCommand( { setParameter: 1, maxTransactionLockRequestTimeoutMillis: 3000 } );

方式二:启动的时候加入参数

mongod --setParameter maxTransactionLockRequestTimeoutMillis=3000

方式三:在(/etc/mongod.cnf)中加入一下配置

setParameter = maxTransactionLockRequestTimeoutMillis=3000

其中3000为最大锁等待时间,可自由调配

集群

如果是副本集分片建议在每台服务器都执行相同的配置

加完这个参数建议重启一下应用

作者:岁月安然

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值