1

首先,我是编程新手。

我正在尝试制作一个使用许多任务的程序。这些任务会将数据插入到多个关系表中。(我正在使用 sql 服务器)

但是,我认为可能存在并发问题,例如,当一个任务在另一个关系表中将数据插入第一个表并使用最后插入的标识 id 时,同时另一个任务可以将数据插入第一个表并更改最后插入的身份 id,所以在这种情况下,随着最后插入的身份 id 更改,第一个任务将使用错误的(由第二个任务更改)最后插入的身份 id,我猜。

我想使用可序列化的锁来锁定整个事务,我想这会起作用,但这也会影响我猜的性能。

那么,在不影响性能的情况下我应该怎么做呢?

4

2 回答 2

0

The IDENTITY value assigned by an INSERT statement is available with SCOPE_IDENTITY(). In the case of a multi-row INSERT, an OUTPUT clause may be used to return the IDENTITY value for each inserted row. These are scoped per connection so the IDENTITY value(s) returned by the first insert of each task will be different in the default READ_COMMITTED isolation level, and can be used for the subsequent insert of related rows into the subsequent tables.

于 2014-08-06T12:32:18.760 回答
0

作为程序员,您需要担心的主要是在正确范围的 TRANSACTION 中进行更改。只要你这样做,你应该没问题。如果您的数据库管理员更改了默认隔离级别,则可能会出现问题,但这种情况非常罕见。

基本格式是

BEGIN TRANSACTION AddUser

INSERT INTO Table1 ...

INSERT INTO Table2 ...

...
COMMIT TRANSACTION AddUser

AddUser 是你想出的名字

如果您这样做,DBMS 将以确保正确结果的最有效方式正确锁定表。好吧,从并发的角度来看是正确的,您的逻辑可能仍然不正确:-)

编辑:注意:新程序员有时会犯的一个错误是在可能导致中断的操作中打开事务。在打开事务之前收集所有输入,不要开始,写一张表,询问用户要做什么,然后写第二张表并提交。如果用户去吃午饭或程序崩溃,这会锁定你的桌子!

于 2014-08-06T12:26:57.577 回答