如何使用多个任务将数据插入多个关系表

时间:2014-08-06 12:17:24

标签: sql sql-server transactions database-concurrency

首先,我是编程新手。

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

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

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

那么,在不损害性能的情况下,我该怎么做?

2 个答案:

答案 0 :(得分:0)

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

基本格式是

BEGIN TRANSACTION AddUser

INSERT INTO Table1 ...

INSERT INTO Table2 ...

...
COMMIT TRANSACTION AddUser

AddUser是你想出的名字

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

编辑:注意:新程序员有时会犯一个错误,即在可能导致中断的操作中保持TRANSACTION打开。在打开事务之前获取所有输入,不要BEGIN,写1个表,询问用户该做什么,然后写第二个表并提交。如果用户去吃午餐或程序崩溃,那就会锁定你的桌子!

答案 1 :(得分:0)

IDENTITY语句分配的INSERT值可用于SCOPE_IDENTITY()。对于多行INSERT,可以使用OUTPUT子句为每个插入的行返回IDENTITY值。这些是每个连接的范围,因此每个任务的第一个插入返回的IDENTITY值在默认的READ_COMMITTED隔离级别中将是不同的,并且可以用于随后将相关行插入到后续的表格。