84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
你这个应用场景很像是:
修改用户余额前,因为怕修改出问题,意外把用户余额改为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...
你这个应用场景很像是:
用一个成语形容这种行为:“慌不择路”
你有没有想过,既然你担心用户余额修改时出问题,那么你也同样要担心用户帐变表插入出问题,那是不是还要另一个表来保证帐变表呢?那另一个表谁来保证呢?
其实,你应该知道正确的解决办法。而不是用两个不安全的办法来凑成1个安全的办法。你这样做,非但没有得到1个安全的办法,反而得到了两个不安全的办法。
正确的办法是,直接修改用户余额表,并且加上排它锁。例如:
不知道会不会导致数据丢失,但有个脑洞,在多线程并发的情况下,很有可能出现后来的数据覆盖前面的数据.即便是先插入一张表中,在多线程中也可能出现后来的先插入的情况吧.
所以建议楼主开启mysql的事务功能,具体的可以看下这个问题
https://segmentfault.com/q/10...