一个用户多条记录,以最后记录产生新的余额记录
来源:互联网 发布:张剑黄皮书知乎 编辑:程序博客网 时间:2024/06/15 06:25
原贴: 点击打开链接
-- 测试表及测试数据开始USE tempdbGOIF OBJECT_ID('t') IS NOT NULL DROP TABLE tCREATE TABLE t(id INT IDENTITY(1,1) PRIMARY KEY ,userId INT NOT NULL,consume INT NOT NULL,balance INT NOT NULL)--第一条记录视为交费,交费直接插入就好,不需要任何逻辑INSERT INTO t(userId,consume,balance) VALUES(120,9,1000)-- 测试表及测试数据结束----- 插入消费记录 BEGIN ------- 用 SqlQueryStress 工具测试 50线程,每线程循环10次DECLARE @userId INT,@consume INTSET @userId=120SET @consume=1 INSERT INTO t(userId,consume,balance)SELECT @userId,@consume,balance-@consumeFROM t WHERE userId=@userIdAND id = (SELECT MAX(id) FROM t WITH(TABLOCK) WHERE userId=@userId)--注:上面With 后面只能加 TABLOCK ,其它锁都会有问题无法通过后面的验证----- 插入消费记录 END ---------- 验证开始 -------验证是否有操作失误的记录(消费了余额不可能不变化)SELECT * FROM t a WHERE EXISTS(SELECT * FROM t b WHERE a.id!=b.id AND a.balance=b.balance)--无记录SELECT TOP 1 * FROM t ORDER BY id DESC/*iduserIdconsumebalance501 120 1 500*/----- 验证结束 -----
后记:
TABLOCK的效率是最低的,不过按楼主的需求,只有表锁才能满足要求了。
建议用户表中增加一个字段:余额,每次更新用户表, 只需要锁定一行, 而且根本不需要写显式的锁和事务。 效率高很多。
更新完用户表, 往现在的这个表里面插入一条记录即可。
附:锁的相关知识:点击打开链接
阅读全文
0 0
- 一个用户多条记录,以最后记录产生新的余额记录
- 获得每个用户的最后一条记录
- 产生10000条连续记录
- 产生10000条连续记录
- 记录一个新的纪元
- 删除重复的记录,并保存第一条记录或保存最后一条记录
- 一种典型问题的解决-取一个小时内的最后两条记录
- 快速生成一个指定条记录数的记录集
- jsp之记录用户登录的总次数以及记录用户最后一次登录的时间
- Oracle中批量产生指定条数的记录
- 播放记录产生两条的bug分析及解决
- mysql修改最后一条记录&删除第一条记录
- SQL查询最后5条记录
- 查询MYsql中最后几条记录
- Oracle EBS新汇总模板创建系统余额表的记录
- Oracle EBS新汇总模板创建系统余额表的记录
- 多条记录拼接成一个字符串
- oralce 一个SQL插入多条记录
- PHP redis有序集合操作【点赞功能】
- mybatis中 SqlSessionTemplate的理解
- 云服务器和虚拟主机的区别
- 笔记:正则电子邮件格式验证
- Android手把手撸一个CustomProgressDialog
- 一个用户多条记录,以最后记录产生新的余额记录
- 面试题24:二叉树的后序遍历序列
- Git 基本命令整理
- linux ls 命令
- 推荐一款免费的C#界面库
- oracle update select ,从A中select后写入B
- QTextEdit 插入Html 表格(table)
- 泛型<?super T> 和<? extends T>区别
- iOS银联网页支付出现的界面没有适配手机端的解决办法!