mysql 单线程写入_关于mysql并发读写问题 悲观锁 数据库锁

在高并发环境中,单线程处理state=0的LIST表数据可能存在数据不一致问题。通过引入悲观锁,可以确保在查询、插入和更新过程中数据的安全性。在MySQL中,设置autocommit为0,使用START TRANSACTION开启事务,配合SELECT ... FOR UPDATE锁定数据,直至COMMIT提交事务,可以避免第三方修改数据,保证操作的原子性和数据一致性。
摘要由CSDN通过智能技术生成

起因:

有这么一个需求:数据库有一张表 list其中有三个字段: id phone state

需要查询出 一条state=0的数据 取出phone 插入到另外一张表 然后设置state=1 代码如下:

//取出符合条件的数据

SELECT * FROM LIST WHERE state = 0 LIMIT 1;

//插入到phone表中

INSERT INTO phone VALUES(NULL,'139490000001');

//设置state状态为1

UPDATE LIST SET state = 1 WHERE phone='139490000001';

上面这种场景单线程访问时正常的,但是在高并发访问的情况下很可能会出现问题。前面已经提到,只有当status为0时才获取这一条数据,上面第一步操作中,查询出来的数据status为0。但是当我们执行第三步Update操作的时候,有可能出现其他人先一步对这条数据把 status修改为1了,但是我们并不知道数据已经被修改了,这样就可能造成同一条数据被修改2次,使得数据不一致。所以说这种方式是不安全的。

使用悲观锁来实现

使用悲观锁的原理就是,当我们在查询出信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为list被锁定了,就不会出现有第三者来对其进行修改了。要使用悲观锁,我们必须关闭mysql数据库的自动提交属性。

//设置自动提交事务

set autocommit = 0;

//0.开始事务

//start transaction;

//1.查询出信息

SELECT * FR

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值