mysql锁机制 php_php - 怎么使用mysql锁机制,保证高并发下数据的一致有效性?

问 题

我有一个消息表msg( 字段有 id , uId 等 ,表的类型为InnoDB),里面存放的是用户发送的私信消息。

我需要做的是:每向 msg 表中插入一条记录,还需要获取新插入的这条记录的 id , 并且将这条 id 存放到 msgInfo 表中,也就是说 msgInfo 表中的某个字段数据来自于 msg表中 的 id字段 。

问题是这样 :

如果同一个账号被多个用户同时使用,并且同时发送了消息(概率虽然很低,但是不代表不会发生),将多个用户发送的消息插入到 msg 后,每个用户返回的 id 不一定是正确的,如:用户A发送消息后返回的那条消息的id ,有可能是用户B发送的消息 id。

解决方法 : 我想的是 , 插入语句执行前,先锁定该 msg 表中,让其他的进程无法插入,插入语句执行后再解锁该 msg 表,这时其他的进程再开始进行。

我的sql 语句为 :

LOCK TABLES msg WRITE ;

INSERT INTO msg.... ;

UNLOCK TABLES;

对 mysql 的锁机制没有怎么了解(以后肯定需要研究的),不知道我写的 sql 语句哪里会有问题,希望老师们给我纠正一下,非常感谢。

有人说使用 Mysql 中的 last_insert_id 就行,没必要锁定,我也查了一些资料,网上说 使用 last_insert_id不用担心并发问题。有老师可以讲下 last_insert_id 的原理吗?

这个问题已被关闭,原因:问题已解决 - 问题已解决,且对他人无借鉴意义

解决方案

mysql有自己的锁机制和隔离级别,你不用担心这个问题。

一般情况mysql是读共享,写排他的,写操作会依次执行,也只是锁行不锁表。

即使是写的同时去读可能带来的脏读幻读,mysql也有对应的方案。

当然具体情况还是要看自己数据库的引擎(现在都是InnoDB了吧),隔离级别等。

在《高性能mysql》有解释过这方面的问题。

我的理解可能不对,毕竟没有碰到过真正大量并发,不对的望指正哈。

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值