首先,我是编程新手。
我正在尝试制作一个使用许多任务的程序。这些任务将数据插入到多个关系表中。 (我使用的是sql server)
但是,我认为可能存在并发问题,例如,当任务将数据插入第一个表并使用最后插入的身份ID时,在另一个关系表中,同时另一个任务可以将数据插入第一个表并更改最后插入的标识ID,因此在这种情况下,当最后插入的标识ID发生更改时,第一个任务将使用错误的(由第二个任务更改)最后插入的标识ID,我猜。
我认为使用可序列化的锁来锁定整个事务,我猜这会起作用,但这也会影响性能我猜。
那么,在不损害性能的情况下,我该怎么做?
答案 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
隔离级别中将是不同的,并且可以用于随后将相关行插入到后续的表格。