数据库乐观锁和悲观锁
悲观锁
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
例子:使用的是Mariadb,用的是for update和事务
MariaDB [test]> begin; MariaDB [test]> select id,deviceid,status from device where status=2 for update; MariaDB [test]> update device set status=1 where id=7; MariaDB [test]> commit;
在另外一个终端查看,如果上面一直没有commit,另一端就会报下面错误
MariaDB [test]> select id,deviceid,status from device where status=2 for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
乐观锁
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
例子:
主要使用redis的setnx或者redis的事务,线程A和线程B同时修改数据的时候,就用setnx上锁,修改完后再解锁,然后在处理另外一个线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】