如何修复这个外键问题MySQL?

时间:2013-03-31 13:26:24

标签: mysql database database-design

我正在开发一个会计应用程序,其中每个交易都有一个密钥。 例如:在销售交易中,有两个条目,一个用于销售帐户,另一个用于客户。

id | trid |日期|帐户|量


112 | 33 | 01-04-2013 |销售A \ c | 300.00
113 | 33 | 01-04-2013 |客户A \ c | 300.00
114 | 34 | 01-04-2013 |销售额A \ c | 110.00
115 | 34 | 01-04-2013 |客户1 A \ c | 110.00
116 | 35 | 01-04-2013 |销售A \ c | 250.00
117 | 35 | 01-04-2013 |客户2 A \ c | 250.00

这里,TRID是MAX(TRID)+ 1.这个概念在单用户环境中工作正常,但在多用户环境中,多个用户同时使用应用程序,一个或多个用户可以获得相同的TRID。

可能是什么解决方案呢?

2 个答案:

答案 0 :(得分:3)

您需要使用事务并在使用期间锁定表以创建原子操作 - 这将确保没有两个进程将使用相同的值。

你需要把proc放在一起,但基本上就是:

-- start transaction
-- lock table
-- select max(trid) + 1 and store in a variable
-- do your inserts
-- unlock table
-- end transaction

答案 1 :(得分:1)

首先,如果TRID单独需要是唯一的,那么将其作为密钥(单独使用,不与其他字段组合使用)。这样,无论您在客户端代码中犯了什么错误,DBMS都不会让任何重复项进入数据库。

在多用户环境中,您可以使用auto-increment安全地生成唯一值,前提是您不必关心生成的值是连续的。

OTOH,如果你买不起“漏洞”,那么:

  • SELECT MAX(TRID) + 1之前锁定整个表格,
  • 或在没有锁定的情况下执行相同的SELECT,但如果存在密钥违规,请准备重新尝试。

如果可以提供帮助,我建议不要使用锁定,因为它会对可伸缩性产生严重的负面影响。