我正在开发一个会计应用程序,其中每个交易都有一个密钥。
例如:在销售交易中,有两个条目,一个用于销售帐户,另一个用于客户。
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。
可能是什么解决方案呢?
答案 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
,但如果存在密钥违规,请准备重新尝试。如果可以提供帮助,我建议不要使用锁定,因为它会对可伸缩性产生严重的负面影响。