如何使用数据库实现多台服务器竞争资源的问题
简单方法:
处理过程分为三个步骤:
1、从数据库查询一条状态为为用的记录(不同的数据库写法会不一样)
select * from table1 where state = '未用' limit 1
2、将数据状态更新为已用,如果更新成功(影响记录数为1表示成功)则表示获取数据成功,否则这条数据已经被其他服务器或线程所抢用。
update table1 set state = '已用' where id='数据id' state = '未用';
3、使用数据,如果未正常使用数据可将数据状态还原为未用
升级方法:
上面这个方法存在一个缺陷,假如获取数据后本服务器挂掉,会导致数据未正常处理,可以考虑另外一个方法处理:增加一个用于记录数据获取的表table2(table1_id(主键),guid(用于唯一标识获取数据放),expired(过期时间))
1、从数据库查询一条状态为为用的记录,不同的数据库写法会不一样
delete from table2 where expired <= '当前时间';(先删除过期的记录,可能获取方已挂掉)
select * from table1 where state = '未用' and not exists(select * from table2 where table1_id = table1.id) limit 1;
2、在table2插入一条数据表名本方已获取数据,如果插入成功(影响记录数为1,没有抛出主键冲突的异常)则表示获取数据成功,否则这条数据已经被其他服务器或线程所抢用。
insert into table2 (...) values (记录的id,本方的唯一标识,当前时间+一个合理的值作为过期时间);
3、使用数据,如果正常使用数据则将数据状态更新为已用,并删除table2的记录
update table1 set state = '已用' where id='数据id' state = '未用';
delete from table2 where id=[id];
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决