操作环境:net, 使用 Quartz.net 做的定时任务。
业务场景:公司有10个仓库,每个仓库有一套独立部署的wms系统,公司服务器可以访问10个仓库的wms数据库。
使用定时任务将10个仓库的wms中的设备表信息拉取到公司的设备表(有更新和插入操作)。
因为可能有的仓库数据库连接不稳定,所以建立了10个定时任务分别去操作。
这就存在多线程同时操作一张表。因为看日志发现有死锁现象:
现在我个人有几个解决方案:
1.操作表的时候加lock锁
2.每个定时任务一个数据库链接,可以形成事务隔离
3.使用队列
说明:定时任务还会有更多的其他的信息表要做同步
设置乐观锁,表增加更新时间或者版本字段,通过这些来控制
Quartz.net本身具有的线程池配置,已经可以适当地处理并发任务,你可以跟据项目的需求增加线程池的大小或减少线程池的队列长度来调整线程池的性能。
还可以考虑使用乐观锁定或悲观锁定,以避免死锁和其他并发问题。使用乐观锁定时,任务将尝试执行操作,并在操作完成时检查是否有其他任务在同一时间修改了相同的数据。如果发现数据已经被修改,则任务将重新执行操作,否则将提交修改。使用悲观锁定时,任务将尝试锁定表中的行,然后执行操作。如果锁定失败,则任务将等待锁定可用,并在锁定成功后执行操作。