一、背景
在P2P项目中,活期通过一张主表t_bid_transfer_control记录用户的总金额,t_bid_order表记录用户取出和存入活期宝的记录。
示例:
t_bid_transfer_control表:
member_id 100
t_bid_order表:
member_id 10 TRANSFER_SUCCESS (转出)
member_id 5 CURRENT_SUCCESS (存入)
活期转出过程:查询主表余额是否足够,足够则记录明细表一条TRANSFER_SUCCESS转出记录。然后调用tss即时转账服务从公司活期专户转出金额到用户账户上。最后更新余额表记录。
如下图:
二、方案一
1、使用synchronized同步方法或者synchronized同步代码块解决。
2、使用JDK1.5后的原子锁Lock解决。
分布式部署,示例如下:
三、方案二
1、 使用数据库行数 select 余额 for update
2、使用分布式锁redis或者zk等解决 。 setnx key value timeout
3、事务提交后释放锁,此时余额已经被更新,第二个线程拿到锁后,首先进行查询,查询到的是更新后的余额。 100——>80
如下图:
四、代码讲解
1、活期宝代码
五、常用锁
悲观锁:查询数据时,先锁定不可修改,当事务提交后释放锁。同时只有一个线程能操作数据。
乐观锁:不锁定修改数据,在最后修改值时通过版本比较(CAS原理)。
锁的重入:锁的嵌套调用
悲观锁:行数、表数 select ….for update
乐观锁:oracle底层update操作是通过SCN(检查点、积累数字),oracle的操作=select+update
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix