惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
I
InfoQ
V
Visual Studio Blog
M
MIT News - Artificial intelligence
H
Help Net Security
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
A
About on SuperTechFans
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
WordPress大学
WordPress大学

MySQL

请教大家一个关于 mysql 服务崩溃的问题 数据库连接数超了如何解决 count 的语句优化问题 连接 MySQL 很慢的问题 MYSQL UPDATE 在很短的时间内更新相同的语句,就会有告警,导至事务失败,有没有人遇到这问题? MySQL 磁盘读取飙升,导致阿里云服务器卡死 求 Macos 下面 homebrew 安装 mysql 到指定目录的方法 使用 EXISTS 优化 IN 子查询 什么时候可以将 mysql 默认隔离机制改为读已提交 跨平台的 MySQL Parser MySQL 大表排序有什么好的方案?只能上 Mongo? Mysql 无法修改自增主键的 AUTO_INCREMENT 值 升级服务器后, mysql 性能反而更慢了,求排查思路 《高性能 MySQL》第三版:是否已经过时? 坑爹的字符集问题:踩到了 MySQL 的 bug 两个人的数据开发团队,被要求从零开始治理企业数据 MySQL 8.4 LTS 与 Metabase 奇怪兼容性问题:降级到 8.0.4 后问题解决 (1Panel and BT Panel 复现) 公司内网,怎么搭建主备 mysql,高可用。故障自动切。 不买云服务 mysql 自增 ID 突然变为 int 最大值问题 覆盖还原 data 文件夹后, mysql 无法启动了 生产力工具 各位大佬,有个奇葩的技术问题 关于 mysql trx_id 的疑惑 发帖一问 sql 性能讨论 数据库高频更新问题 谁遇到过没 有啥好的解决方案部 有用过 SyncNavigator 或者类似的简单数据库同步软件吗, mysql 遇到最愚蠢的查询性能问题,求解决 有什么优雅的 mysql 增加字段名的方法呢? 各位 Mysql 大佬,问一个 8.0 版本 json 的问题 mysql online DDL 时间很长,咋整,数据量不多,就 30W
数据库中 select for update 和 version 乐观锁各自的适用场...
xianyukang · 2025-01-05 · via MySQL

(0) 如题

(1) 比如转账/扣款相关的业务,推荐用悲观锁还是乐观锁?

(2) 脑补了如下的乐观锁实现,可以满足并发转账和取钱需求吗?

(3) 如果能,那么和悲观锁 select for update 作对比哪个更好?

# 数据库初始状态
TRUNCATE account;
INSERT INTO account (id, name, balance, version)
VALUES (1, 'ichigo', 10, 1),
       (2, 'rukia', 10, 1);

# 并发事务 1 转出全部余额
START TRANSACTION;
SELECT balance, version FROM account WHERE id = 1;
SELECT version FROM account WHERE id = 2;
UPDATE account SET balance = balance - 10, version = 2 WHERE id = 1 AND version = 1;
UPDATE account SET balance = balance + 10, version = 2 WHERE id = 2 AND version = 1;
COMMIT;

# 并发事务 2 取出全部余额
START TRANSACTION;
SELECT balance, version FROM account WHERE id = 1;
UPDATE account SET balance = balance - 10, version = 2 WHERE id = 1 AND version = 1;
COMMIT;