mysql优化 - mysql数据insert快还是update比较快
问题描述
问题解答
回答1:你这个应用场景很像是:
修改用户余额前,因为怕修改出问题,意外把用户余额改为0什么的。而选择先插入一条记录到用户账务变动表,然后查出账务变动表的数据,来更新用户余额字段。
用一个成语形容这种行为:“慌不择路”
你有没有想过,既然你担心用户余额修改时出问题,那么你也同样要担心用户帐变表插入出问题,那是不是还要另一个表来保证帐变表呢?那另一个表谁来保证呢?
其实,你应该知道正确的解决办法。而不是用两个不安全的办法来凑成1个安全的办法。你这样做,非但没有得到1个安全的办法,反而得到了两个不安全的办法。
正确的办法是,直接修改用户余额表,并且加上排它锁。例如:
// 开始事物BEGIN ;// 取出该用户数据,并锁住,防止其他线程(进程)读取该条记录SELECT * FROM users where id = $id FOR UPDATE ;// 处理业务...计算用户新的余额// 更新用户余额UPDATE users SET money = $new_money;// 获取影响行数=1,则:{ // 提交事物(解锁我们锁定的记录) COMMIT ;}else{ // 发现不对,撤销我们在事物内做的所有操作 ROLLBACK ;}回答2:
不知道会不会导致数据丢失,但有个脑洞,在多线程并发的情况下,很有可能出现后来的数据覆盖前面的数据.即便是先插入一张表中,在多线程中也可能出现后来的先插入的情况吧.
所以建议楼主开启mysql的事务功能,具体的可以看下这个问题
https://segmentfault.com/q/10...
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题3. MYSQL新建用户设置可以远程访问的问题4. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?5. java - mybatis怎么实现在数据库中有就修改,没有就添加6. mysql - 我的myeclipse一直连显示数据库连接失败,不知道为什么7. linux - 为什么我在mysql的my.cnf下找不到bind-address?8. MySQL中的enum类型有什么优点?9. mysql多表联合查询优化的问题10. 数据库设计 - MySQL数据库主键问题
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)