【问题标题】:TransactionScope, Selects using SubsonicTransactionScope,使用 Subsonic 选择
【发布时间】:2009-08-25 09:25:20
【问题描述】:

我有一个 Invoice 表(和一个 SubSonic 'Invoice' ActiveRecord() 和一个需要具有唯一编号的InvoiceNumebr 列。我正在尝试使用块在TransactionScopeGetTheNextAvailableNumber()。这有效。

我不确定的是,如果 5 或 50 个不同的用户尝试以大约同时,如果 5 或 50 个用户稍后才保存发票对象,该方法将为所有用户返回相同的数字。

TransactionScope 块内调用的GetTheNextAvailableNumber() 方法使用带有MAX() 的Subsonic Select 查询来获取最大数,然后加1。列本身确实有一个唯一索引!

交易的隔离级别默认(可序列化)是否会确保每个交易都有一个唯一的编号?还是有更聪明的机制来实现这一目标? 该列不能有 IDENTITY,因为 PK 列 InvoiceID 已经有它。

【问题讨论】:

    标签: subsonic


    【解决方案1】:

    您在这里谈论的是跨事务跨度的并发性 - 唯一可行的方法是在 trannie 执行时在表上加锁......这可能会杀死您的应用程序。

    您是否有机会使用 Guid?

    【讨论】:

    • 谢谢 Rob,我正在考虑使用 Guid 作为表的主键,但是,对于发票编号,我需要一个格式良好、可读的数字(带前导零的 int 或 bigint,如 0000000191)。我想使用 Guid 作为 PK 会让我在发票编号列上使用 IDENTITY ......对吗?
    【解决方案2】:

    如果您在数据库中构建第二个表并将NextAvailableNumber 的值存储在该表中会怎样。然后,您将使用存储过程来检索该值并在同一次调用中递增它。您只需要锁定该存储过程以防止并发调用。您还可以将其锁定在存储过程中。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多