我有一个消息表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 回答
![?](http://img1.sycdn.imooc.com/545863cd0001b72a02200220-100-100.jpg)
狐的传说
TA贡献1804条经验 获得超3个赞
mysql有自己的锁机制和隔离级别,你不用担心这个问题。
一般情况mysql是读共享,写排他的,写操作会依次执行,也只是锁行不锁表。
即使是写的同时去读可能带来的脏读幻读,mysql也有对应的方案。
当然具体情况还是要看自己数据库的引擎(现在都是InnoDB了吧),隔离级别等。
在《高性能mysql》有解释过这方面的问题。
我的理解可能不对,毕竟没有碰到过真正大量并发,不对的望指正哈。
- 4 回答
- 0 关注
- 534 浏览
添加回答
举报
0/150
提交
取消