V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  hhhhhh123  ›  全部回复第 7 页 / 共 15 页
回复总数  284
1  2  3  4  5  6  7  8  9  10 ... 15  
把个人博客啥的 搭在这个服务器 免费用。。
2022-11-29 17:39:59 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@raysonlu
session1 : SELECT pk_money FROM user_basic_info WHERE uid = 123456803; # pk_money= 496

session2:
```
BEGIN;
set autocommit=0;
select `pk_money` from user_basic_info where uid=123456803 for update ;
update user_basic_info set pk_money=pk_money+1 where uid=123456803;
# 这里没有 commit
```
结果
```
BEGIN
> OK
> Time: 0.047s


set autocommit=0
> OK
> Time: 0.045s


select `pk_money` from user_basic_info where uid=123456803 for update
> Affected rows: 0
> Time: 0.042s


update user_basic_info set pk_money=pk_money+1 where uid=123456803
> Affected rows: 1
> Time: 0.044s

```
再次运行 session1
session1 : SELECT pk_money FROM user_basic_info WHERE uid = 123456803; # pk_money= 497
2022-11-29 09:10:50 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@zhanglintc 主要是不会贴图片, 不然我就吧图片贴上来。 确确实实+1 。 不过代码就不会。 我也很好奇。 理论上确实不应该拿到未提交数据且更新到数据中了
2022-11-28 17:59:35 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@zhanglintc 因为网上的教程都是先 select 在 update 我以为这是必要流程
2022-11-28 15:35:12 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
是 InnoDB
2022-11-28 15:32:16 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao
@xhinliang
```
select @@transaction_isolation;
select @@global.transaction_isolation;
```
  结果是 REPEATABLE-READ
2022-11-28 15:29:28 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@xhinliang ``` show variables like '%tx_isolation%';``` 返回结果是空 啥也没有 ,这种是什么
2022-11-28 15:26:41 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao 还有个疑问, 就算是脏读 也不应该更新数据到数据库吧? 更新到数据库那不就持久化了?
2022-11-28 15:21:46 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@xhinliang 数据在数据库中确确实实的变化的 += 1
2022-11-28 15:19:56 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao 新会话就是 + 1
2022-11-28 15:16:35 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
百度了一下 个人感觉很像是 脏读。
事务并发调度的问题
1. 脏读( dirty read ):A 事务读取 B 事务尚未提交的更改数据,并在这个数据基础上操作。如果 B 事务回滚,那么 A 事务读到的数据根本不是合法的,称为脏读。在 oracle 中,由于有 version 控制,不会出现脏读。
2. 不可重复读( unrepeatable read ):A 事务读取了 B 事务已经提交的更改(或删除)数据。比如 A 事务第一次读取数据,然后 B 事务更改该数据并提交,A 事务再次读取数据,两次读取的数据不一样。
3. 幻读( phantom read ):A 事务读取了 B 事务已经提交的新增数据。注意和不可重复读的区别,这里是新增,不可重复读是更改(或删除)。这两种情况对策是不一样的,对于不可重复读,只需要采取行级锁防止该记录数据被更改或删除,然而对于幻读必须加表级锁,防止在这个表中新增一条数据。
4.第一类丢失更新:A 事务撤销时,把已提交的 B 事务的数据覆盖掉。
5.第二类丢失更新:A 事务提交时,把已提交的 B 事务的数据覆盖掉。
2022-11-28 15:10:09 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao 顺便请教一下。 为啥网上几乎所有的教程都是要写一个 select 语法 + for update 。
2022-11-28 15:08:20 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao 结果是一样的, 但是把 commit 注释 , 在窗口一直运行重复的代码, 结果会自动+=1 。 这个问题是为什么?
2022-11-28 15:05:09 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao 自带这个问题我不是很清楚,sql 目前只会写 curd 。目前在接触更高级的
2022-11-28 15:04:08 +08:00
回复了 hhhhhh123 创建的主题 程序员 mysql 悲观锁 机制 请教
@rqxiao 主键就是 uid
2022-11-28 09:46:21 +08:00
回复了 hhhhhh123 创建的主题 程序员 高并发下怎么做余额扣减?
我的新思路是 : 只要保证每个请求都是正确的扣钱请求。 然后参考 8 楼, 当然第三个条件只能是一直递归下去, 吧所有的请求都给操作完。
2022-11-28 09:41:58 +08:00
回复了 hhhhhh123 创建的主题 程序员 高并发下怎么做余额扣减?
@vanillacloud @codehz @8520ccc @richangfan 如果这样的话, 同时有俩个 一个扣款 10 块 一个扣款 5 块。 这样只会执行其中的一个余额。 另外一个就不会执行。 我觉得 8 楼的 第三个条件挺好, 但是递归次数 又不好拿捏。
2022-11-28 09:36:05 +08:00
回复了 hhhhhh123 创建的主题 程序员 高并发下怎么做余额扣减?
@ElmerZhang 我理解 第一步和第二步 ,第三部不是特别理解, 为啥只递归一次?
2022-11-25 17:31:40 +08:00
回复了 hhhhhh123 创建的主题 程序员 高并发下怎么做余额扣减?
@Jooooooooo 那库存这种问题 应该怎么解决?
1  2  3  4  5  6  7  8  9  10 ... 15  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2651 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 15ms · UTC 13:05 · PVG 21:05 · LAX 06:05 · JFK 09:05
Developed with CodeLauncher
♥ Do have faith in what you're doing.