0

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

编号 | 三重奏 | 日期 | 帐户 | 数量


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。

有什么解决办法呢?

4

2 回答 2

3

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

您需要将 proc 放在一起,但基本上是:

-- start transaction
-- lock table
-- select max(trid) + 1 and store in a variable
-- do your inserts
-- unlock table
-- end transaction
于 2013-03-31T13:32:38.630 回答
1

First of all, if TRID alone needs to be unique, then make it a key (alone, not in combination with some other field). This way, the DBMS will not let any duplicates enter the database, no matter what mistakes you make in the client code.

In the multi-user environment, you can use an auto-increment to safely generate unique values, provided you don't care for generated values being contiguous.

OTOH, if you can't afford "holes", then:

  • either lock the whole table before SELECT MAX(TRID) + 1,
  • or do the same SELECT without locking but be prepared to re-try if there is a key violation.

I'd recommend against the locking if you can help it, since it can have serious negative impact on scalability.

于 2013-04-01T14:36:28.563 回答