一般来说,处理这种并发问题都用数据库锁,如何用 就是在判断查询语句后加上for update或者类似的加锁功能,我以oracle数据库为例 例如 select * from user where id=1001 for update . 这样就把用户为1001这行数据锁住,后面任何请求过来都会等待,直到第一个执行这个查询的人讲事物锁释放,后面的请求才能继续操作,这样就不会有脏读的问题了。
这里存在一个性能问题,就是如果前面的请求不释放锁后面的请求就会等待,如果业务逻辑复杂而且耗时较长,或者这个操作的并发量极大,会非常影响用户体验,处理这种问题有多种方式,但是每种方式都有优劣,要根据你自身业务的需求来定制。一种是使用nowait方式,即是遇到被锁则终止操作要求用户重新提交。另一种是我们如今常用的方式——乐观锁,即是我们一开始并不去判断冲突的问题,而是先进行业务逻辑的操作(先认为它的操作是合理合法的),然后在最终要提交时做判断并加锁,如果判断正确则pass,如果错误则回滚之前的操作。
If your lock works properly, it should be ok. As for mysql, make sure you have innodb as the engine, which support row level locking.
https://dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html