在游标定义中,普通的定义方法为: DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors 这时,只能浏览或取表中的值,将语句改为: DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors For Update 也就是在原语句的后面增加For Update 就可以了
DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors For Update OF 更新的列表.....
我只是想实现这样的功能呀. 先select * from xzt delete from xzt 就是担心在这两句之间操作时会有数据写进来呀
--trybegin tran declare @i1 int, @i2 int select * from xzt set @i1=@@rowcountdelete from xzt set @i2=@@rowcountif @i1=@i2 commit tran else rollback tran
-- 下面通过一个试验来说明问题-- 1. 建立测试环境 USE tempdb GOCREATE TABLE dbo.tb(id int PRIMARY KEY) INSERT dbo.tb SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 GO
-- 2.a 新开一个查询窗口, 输入下面的语句 USE tempdb GOSET TRANSACTION ISOLATION LEVEL -- REPEATABLE READ SERIALIZABLE DECLARE @id int SET @id = 3 BEGIN TRAN SELECT * FROM dbo.tb WHERE id < @id WAITFOR DELAY '00:00:10' DELETE FROM dbo.tb WHERE id < @id COMMIT TRANSELECT * FROM dbo.tb GO
-- 2. b 新开一个查询窗口, 输入下面的语句 USE tempdb GOINSERT dbo.tb VALUES(0)
为了测试更新, 2.b的语句还可能需要换成下面的:UPDATE dbo.tb SET id = 11 WHERE id = 1你会发现, 无论事务隔离级别是 REPEATABLE RED, 还是 SERIALTZABLE, UPDATE都是被阻止到 2.a 的事务完成的.注意: 每次测试请重新建立测试环境.
SET TRANSACTION ISOLATION LEVEL --REPEATABLE READ SERIALIZABLE 请问这句话是什么意思??
DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors
这时,只能浏览或取表中的值,将语句改为:
DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors
For Update
也就是在原语句的后面增加For Update 就可以了
For Update OF 更新的列表.....
先select * from xzt
delete from xzt
就是担心在这两句之间操作时会有数据写进来呀
declare @i1 int, @i2 int
select * from xzt
set @i1=@@rowcountdelete from xzt
set @i2=@@rowcountif @i1=@i2
commit tran
else
rollback tran
如果是后者, 则事务隔离级别必须提供到: SERIALIZABLE
USE tempdb
GOCREATE TABLE dbo.tb(id int PRIMARY KEY)
INSERT dbo.tb SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
GO
USE tempdb
GOSET TRANSACTION ISOLATION LEVEL
-- REPEATABLE READ
SERIALIZABLE DECLARE @id int
SET @id = 3
BEGIN TRAN
SELECT * FROM dbo.tb WHERE id < @id
WAITFOR DELAY '00:00:10'
DELETE FROM dbo.tb WHERE id < @id
COMMIT TRANSELECT * FROM dbo.tb
GO
USE tempdb
GOINSERT dbo.tb VALUES(0)
你会发现2.b很快执行完成, 5秒钟后, 检查 2.a , 你会发现 2.a 把 2.b 新插入的 id = 0 的记录删除掉了如果查询窗口2.a中, 事务隔离级别设置的语句设置的事务隔离级别是: SERIALIZABLE
则2.b不会立即执行完成, 而要到2.a执行完成事务后才会完成, 5秒钟后, 检查 2.a , 你会发现 2.a 无法把 2.b 新插入的 id = 0 的记录删除掉
每次测试请重新建立测试环境.
--REPEATABLE READ
SERIALIZABLE 请问这句话是什么意思??
--------------
呵呵,这里是邹老大的地盘~~~