序
最近在项目尝试使用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
为最大锁等待时间,可自由调配
集群
如果是副本集
或分片
建议在每台服务器都执行相同的配置
终
加完这个参数建议重启一下应用
原文地址:https://segmentfault.com/a/1190000022518374