Mysql手动自增并发连接数证明

标签 mysql concurrency transactions

我有一个发票表 (innoDB),我需要在其中手动设置下一张发票的累进编号。我现在的代码是

SELECT MAX(invoice_n) FROM invoices WHERE invoice_y = 2013

然后定期保存记录,将新的 invoice_n = max + 1。我在 invoice_n-invoice_y 上有一个唯一的索引,我正在记录数据库错误,所以我发现有时我有重复的键输入错误,因为我有数百个不同的用户连接。我将代码放在一个循环中,一直持续到生成发票为止,但我认为可以有更优雅的解决方案,尤其是使用事务。我读了一点书,但我不明白如何通过交易实现我的结果。

有什么帮助吗?

最佳答案

你可以使用 "AUTO_INCREMENT"在您的列定义中。如果插入失败,您会看到数字之间有一些空隙。

另一种方法是创建一个包含每年最后一个索引的表(请参阅评论)并按照以下步骤操作:

  1. 开始交易
  2. 选择更新每行的最后一个索引并递增
  3. 插入新发票
  4. 提交您的交易

一些链接:

另一个,您可以使用“乐观的方法”,如果因为重复的键而失败,则重复选择和插入。

希望对您有所帮助,欢迎大家留言!

关于Mysql手动自增并发连接数证明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14457042/

相关文章:

mysql - OSX 10.10 Yosemite my.cnf 未被读取无法正常工作

php - Mysql SELECT ASC 没有最后 50 行

c# - 单个 ODBC ExecuteNonQuery (C#) 中的多个插入语句

ios - 为什么我应该在 main 中为串行队列创建上下文并在 start 中为并发队列创建上下文?

java - 处理 spring 数据中的并发事务

mysql - 优化 MySQL 的重复查询

ios - 如何在获取歌曲列表的所有 Persistent ID 和 Assets URL 时防止设备挂起?

java - 最后处理某些流元素

c# - 通过一笔交易选择并更新

python - 属性错误 : _nanosecond when updating a datetime in transaction