使用NOLOCK的SQL Server选择查询不起作用

时间:2012-04-02 09:47:41

标签: java sql-server sql-server-2008

我有以下查询

 SELECT *
  FROM T1 with (NOLOCK )

选择查询可以随用户(I)执行任何操作。

我的应用程序脚本正在插入1000行数据并删除旧数据: 所有这些语句都在我的java代码中。插入是批量插入。

- 我在这里设置了autocommit false

truncate table T1
insert into table T1 values(x,y,z)
truncate table T2
insert into table T2 values(x,y,z)...and other

- 我在这里提交交易

但是在截断和插入完成之前,我没有从T1获取数据。怎么可能避免这种情况呢?

3 个答案:

答案 0 :(得分:1)

您应该考虑用BULK INSERT替换INSERT INTO语句。还要考虑在运行脚本之前更改事务隔离级别,并在运行脚本后恢复,例如

alter database mydb set READ_COMMITTED_SNAPSHOT ON

甚至

alter database mydb set READ_UNCOMMITED_SNAPSHOT ON

这将有效地让你完全摆脱NOLOCK语句。

答案 1 :(得分:0)

在完成所有批次之前,您将无法查看数据。即使您正在执行read uncommitted select,插入的数据也只会在完成insert命令时存在于表中

truncate table T1
insert into table T1 values(x,y,z)

**data available for dirty read on T1 here **

truncate table T2
insert into table T2 values(x,y,z)...and other

你可以通过这样做来测试我的意思:

truncate table T1
insert into table T1 values(x,y,'My test values')
**read data here**
insert into table T1 values(x,y,z)

如果您对在此处读取数据进行脏读,您将能够看到“我的测试值”

答案 2 :(得分:-1)

  

SELECT * FROM T1(NOLOCK)

跳过“with”。