数据库表何时被锁定?

时间:2010-01-31 22:36:08

标签: database sql-server-2008 insert locking

每次插入内容时是否锁定了表格?因为我想每秒插入数千行,所以我想知道是否有多个插入线程有效或无效。如果每个插入锁定表,则一个线程几乎与例如10个线程一样有效。 如果它依赖于数据库引擎,我使用SQL Server 2008。

2 个答案:

答案 0 :(得分:4)

VoidPointer不一定正确。他也不一定是不正确的。这取决于您有多线程应用程序的原因。如果线程纯粹被设计为“插入更多数据”的机制,那么它可能不会提高性能。但是,如果线程有其他用途,那么它表明你的延迟可能在系统的其他地方,你不应该担心数据库过多。为什么你有这些线程?大概你正试图让其他一些操作更有效 - 比如多个I / O绑定调用以未知的时间间隔完成但是减少了最长运行线程长度的整体延迟?如果没有更多关于你想要实现的内容和原因的背景,你不能简单地说多线程解决方案是错误的。

查看some of the locking hint options SQL Server supports ..

认为 SQL Server支持并发INSERT

答案 1 :(得分:3)

鉴于数据库是“瓶颈”而不是线程正在进行的工作,使得来自不同线程的所有插入(使用单独连接)将无助于您的性能。特别是如果您在新事务中执行每个插入操作。每次提交事务时,数据库都需要工作以确保维护数据完整性。这尤其糟糕,因为所有交易都会竞争对同一对象进行更改。

不要为插入使用多个线程,而应确保在一个事务中执行所有操作,并且只在完成所有插入操作时提交。

BEGIN TRANSACTION;
INSERT INTO myTable (Col1, Col2) 'First' ,1;
INSERT INTO myTable (Col1, Col2) 'Second' ,2;
...
COMMIT;

N.B。 - 也可以在一个版本中完成所有插入,但这在性能方面没有任何区别:

INSERT INTO myTable (Col1, Col2)
    SELECT 'First' ,1
    UNION ALL
    SELECT 'Second' ,2
    UNION ALL
    SELECT 'Third' ,3;

在我看来,在事务中分组的多个插入更加直接。另外,第二个版本可能会产生一个嵌套语句,该语句对于数据库来说太过分了。