mysql 对某一个数据进行统计

当我有两张表:商品表、商品评论表。后台需要看到该商品有多少条评论时,我是去根据商品id在商品评论表里统计或者在商品表里添加一个Comment_number字段,每当用户评论的时候在原来的基础上+1,这两种方式去统计。第一种方式如果商品评论表数据非常大的情况下耗时就会增加,第二种方式如果两个用户同时填写了评论,那这个Comment_number值就少增加一次。我想问问第二种方式如果遇到这种情况要怎么处理。

UPDATE goods SET Comment_number = Comment_number + 1 WHERE id=1;

其实这是两步操作:

a = SELECT * FROM goods WHERE id=1;
UPDATE goods SET num = a.Comment_number + 1 WHERE id=1;

其中执行SELECT语句时没有加锁,只有在执行UPDATE时才进行加锁的。

而针对这个问题,可以通过事务显式的对 SELECT 进行加锁:

SET AUTOCOMMIT=0; 
BEGIN WORK; 
 a = SELECT num FROM goods WHERE id=2 FOR UPDATE; 
 UPDATE goods SET num = a.Comment_number + 1 WHERE id=2; 
COMMIT WORK;

这样只要以后更新数据时,在并发的情况下,后执行的事务就会被堵塞,直到当前事务执行完成。

1.我自己公司的做法是有2种:

A.MQ异步处理,每次评论时,发送一个MQ,另外一个专门的程序接受MQ,进行更新处理,把并发改成串行处理,并发处理能力增强。

B.把更新放入事务里,对同一个ID做update操作,MYSQL会先上记录锁,不同事务更新同一个记录时,如果有事务已经获取了记录锁,别的事务只有等待该事务释放完锁以后才会继续更新,UPDATE 表名 SET Comment_number = Comment_number + 1 WHERE ID=XXX;事务内是当前读的。别的事务只要提交了,释放了记录锁,这个update语句是会获取当前记录该字段最新内容,然后加1。基本不会漏更新