我正在编写一个程序,用于保存数据库中的金额记录。每个当前插入的数量都依赖于之前保存的金额,并从该值增加。
就像:
select amount from table order by id desc limit 1;
然后我将以当前金额增加可用的最新金额,并将其作为新行插入。
假设数据库中的第一个数量是100,下一个要插入的数量是150,30和70.这就是逻辑的方式:
前
id - amount
1 - 100
后
id - amount
1 - 100
2 - 250 (get previous 100, then add 150)
3 - 280 (get previous 250, then add 30)
4 - 350 (get previous 280, then add 70)
但问题是当我多次执行此过程时(每次点击都会通过ajax触发php进程),它会使一些记录重复,这是错误的:
多次制作流程时会发生什么
id - amount
1 - 100
2 - 250 (get previous 100, then add 150)
3 - 130 (get previous 250, then add 30)
4 - 200 (get previous 280, then add 70)
似乎,当我插入 id#3 时,在select上找到的数据库上保存的值仍然是100而250还没有插入,这就是为什么新插入的数据采用较旧的值
是否还有其他方法可以阻止我这样的过程,因此从db中保存重复数量或从旧数量值增加?
到目前为止,我尝试过的是设置一个日期时间,并根据之前保存的日期时间每1秒生成一次请求。还是行不通。也许是因为mysql很慢,我不确定。
感谢任何帮助,谢谢。
答案 0 :(得分:1)
我想到了一些建议。
交易。这些将允许您获取最后一行并添加一个新的组作为一个组。 http://www.mysqltutorial.org/mysql-transaction.aspx 虽然我不确定,但我认为这些会对你的情况起作用。
表锁定。 http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html - 这有其自身的优点和缺点。
此外,您可以执行3次查询 - 带有非填充金额的插入,然后返回ID,之前选择该行,然后更新更新金额。像这样(伪代码):
1. insert into table (amount) values (30)
2. get last inserted id (assuming autoincrement else you could use timestamps and get the last row before the timestamp used in #1)
3. select from table where id = (last_inserted_id - 1)
4. update where id=last_inserted_id set amount += (#3 amount)