首页 > 开发 > php > 正文

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

2017-09-06 13:34:21  来源:网友分享

我有一个消息表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》有解释过这方面的问题。
我的理解可能不对,毕竟没有碰到过真正大量并发,不对的望指正哈。