2

我的应用程序需要写入一个充当系统范围计数器的表,并且该计数器需要在整个系统及其所有应用程序中都是唯一的。

这个计数器目前在我们的 Oracle 数据库中作为一个表实现。

我的问题是:我需要写入这个计数器表(它使用一些键来保证每个业务流程中的计数器在系统中的唯一性)而不会将其锁定在当前事务中,因为多个其他进程可能会读取或写入这个表也​​是。计数器中的间隙无关紧要,但我无法提前创建计数器值。

在这种情况下,简单的序列对我没有帮助,因为序列号是一个格式化的数字。

目前,我有一些其他非数据库替代方案来实现这一点,但我想在一段时间内尽可能避免更改系统代码。

实际上,如果我可以打开一个不参与当前事务的新连接,写入表,然后关闭这个新连接,那将是最简单的,但是我疲惫的头脑找不到办法去做。

答案一定是显而易见的,但光现在还没有照在我身上。

4

2 回答 2

3

在使用“Suppress”选项创建的 TransactionScope 块内执行您的命令。这样您的命令将不会参与当前事务。

using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
{
    // Execute your command here
}

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx

于 2012-12-17T21:10:04.333 回答
1

当然。只需制作一个配置为打开不与外部事务耦合的新事务(内部事务)的组件。

阅读http://msdn.microsoft.com/en-us/library/ms172152%28v=vs.90%29.aspx#Y1642了解 TransactionScopes 的进展情况。

于 2012-12-17T21:09:16.403 回答