数据库的事务能否代替编程语言中的互斥锁

Rosalba ·
更新时间:2024-11-10
· 823 次阅读

写代码的时候出现了一个思路上的问题
就是对于数据库中的数据,有并发问题 ,比如用户的好友最大数量30,当前用户的好友数量是29,如果用户之前向另外2位玩家发送过好友申请,并且这2位好友同时同意的话,就会出现并发问题。
该逻辑中,是执行了多条不同的sql来处理这个加好友的实现,多条sql是在一个事务中执行的。我一开始的解决思路是在执行第一条sql的时候就加锁,执行完全部sql的时候解锁,但是想到了mysql中是有行锁的 并且第一条sql是会触发行锁的sql ,属于删改类型的sql。

默认这2个线程 的过滤条件是一样的 这样会触发行锁

现在有2个线程 第一个线程开启了事务,执行了一系列的sql,第二个线程也开启了事务,但在执行第一条sql的时候,由于第一个线程没有commit提交,第二线程就会阻塞在第一条sql,也不会执行接下来代码,这样不是就等于互斥锁了吗,只有第一个线程commit,第二线程才会接着往下执行。如果还在代码中加互斥锁,是不是多此一举了。

开启事务 第一条update 语句 where id = 1 编程语言代码中的逻辑 if xxx{ } 第二条update语句 where id = 2 编程语言代码中的逻辑.... 第三条update语句 where id = 3 ... 提交事务

我一开始认为,如果一个线程开启了事务,并且执行了一系列sql,但是没有提交。另一个线程执行同样的一系列sql 是不会阻塞的,只会在commit的时候阻塞。如果是这样的话,事务就不能代替互斥锁。但我测试过后,发现只要同样的过滤条件,被一个已经开启的事务的会话所执行,并且没有提交。那么其他会话执行sql也会阻塞。

数据的初始状态这里是引用
第一步:
创建一个会话 并且开启事务 执行这条修改语句 但是没有commit
原创文章 5获赞 0访问量 787 关注 私信 展开阅读全文
作者:a.亮亮亮wl



数据 互斥 互斥锁 事务 编程语言 数据库

需要 登录 后方可回复, 如果你还没有账号请 注册新账号