为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
饮歌长啸 2019-03-18 05:17:25
我有一个消息表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 的原理吗?
查看完整描述

4 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

mysql有自己的锁机制和隔离级别,你不用担心这个问题。
一般情况mysql是读共享,写排他的,写操作会依次执行,也只是锁行不锁表。
即使是写的同时去读可能带来的脏读幻读,mysql也有对应的方案。
当然具体情况还是要看自己数据库的引擎(现在都是InnoDB了吧),隔离级别等。
在《高性能mysql》有解释过这方面的问题。
我的理解可能不对,毕竟没有碰到过真正大量并发,不对的望指正哈。

查看完整回答
反对 回复 2019-03-18
?
UYOU

TA贡献1878条经验 获得超4个赞

了解一下事务,隔离级别,以及自增锁

查看完整回答
反对 回复 2019-03-18
?
RISEBY

TA贡献1856条经验 获得超5个赞

这个问题可以换个思路,id由应用程序产生,就没有你说的数据不一致的问题了。

查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 534 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信