战狂粗人张

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  228 随笔 :: 0 文章 :: 12 评论 :: 20万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一、背景

在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

 

posted on   战狂粗人张  阅读(98)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示