我有以下查询
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获取数据。怎么可能避免这种情况呢?
答案 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”。