mysql优化 - mysql数据insert快还是update比较快
高洛峰
高洛峰 2017-04-17 16:27:11
0
2
752
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(2)
小葫芦

你这个应用场景很像是:

修改用户余额前,因为怕修改出问题,意外把用户余额改为0什么的。
而选择先插入一条记录到用户账务变动表,然后查出账务变动表的数据,来更新用户余额字段。


用一个成语形容这种行为:“慌不择路”

你有没有想过,既然你担心用户余额修改时出问题,那么你也同样要担心用户帐变表插入出问题,那是不是还要另一个表来保证帐变表呢?那另一个表谁来保证呢?

其实,你应该知道正确的解决办法。而不是用两个不安全的办法来凑成1个安全的办法。你这样做,非但没有得到1个安全的办法,反而得到了两个不安全的办法。

正确的办法是,直接修改用户余额表,并且加上排它锁。例如:

// 开始事物
BEGIN ;

// 取出该用户数据,并锁住,防止其他线程(进程)读取该条记录
SELECT * FROM users where id = $id FOR UPDATE ;

// 处理业务...计算用户新的余额

// 更新用户余额
UPDATE users SET money = $new_money;

// 获取影响行数=1,则:{
  // 提交事物(解锁我们锁定的记录)
  COMMIT ;
}else{
  // 发现不对,撤销我们在事物内做的所有操作
  ROLLBACK ;
}
伊谢尔伦

不知道会不会导致数据丢失,但有个脑洞,在多线程并发的情况下,很有可能出现后来的数据覆盖前面的数据.即便是先插入一张表中,在多线程中也可能出现后来的先插入的情况吧.

所以建议楼主开启mysql的事务功能,具体的可以看下这个问题

https://segmentfault.com/q/10...

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!