1、游标循环里是否可以使用事务控制??
数据库程序中很重要的一点就是事务处理(transaction或者the unit of work(UOW))。事务当中的任何一部分失败,整个事物就会失败。利用COMMIT和ROLLBACK进行适当的事务控制对于保证数据完整性来说是至关重要的。
当在使用游标的时候使用COMMIT或者ROLLBACK语句时,游标的行动取决于是否在生命的时候加了WITH HOLD子句。如果一个游标在声明的时候没有指定WITH HOLD,那么它的所有资源(游标,锁,大对象数据类型或者LOB locators)都将在COMMIT或者ROLLBACK之后被释放。因此,如果需要在完成一个事务之后使用游标,就必须重新打开游标,并从第一行开始执行。如果定义了一个游标WITH HOLD
,游标就会在事务之间保存它的位置和锁(lock)。需要明白的是,只有保证游标位置的锁被held了。
锁(lock)是个数据库对象(a database object),我们用它来控制多个应用访问同一个资源的方式。而一个LOB locator使存储在本地变量中的4字节的值,程序可以用它来查到数据库系统中的LOB对象的值
A:定义了WITH HOLD的游标在COMMIT之后
1.仍然保证是打开(open)的
2.游标指向下一个满足条件的行之前
3.在COMMIT语句之后只允许FETCH和CLOSE
4.Positioned delete和positioned update只在同一事务中fetch的行上可用
5.所有的LOB locators会被释放
6.除了保存声明为WITH HOLD的游标位置的锁,其他锁都会释放
7.当执行了数据修改语句或者含有WITH HOLD游标的修改语句被commit的时候
B:所有定义为WITH HOLD的游标在ROLLBACK之后:
1.所有游标会被关闭
2.所有在该事务中的锁会被释放
3.所有的LOB locators会被freed
无论是否使用with hold与否,rollback将释放session中的游标。commit只释放不带with hold的游标。
2、
3、来自其他:
在SQL中有一个设置的选项SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }可以控制在提交事务时是否关闭游标。
当 SET CURSOR_CLOSE_ON_COMMIT 为 ON 时,该设置遵从 SQL-92 标准,在提交或回滚时关闭任何打开的游标。
当 SET CURSOR_CLOSE_ON_COMMIT 为 OFF 时,提交事务时不关闭游标。
当 SET CURSOR_CLOSE_ON_COMMIT 为 OFF 时,ROLLBACK 语句将只关闭打开的未完全填充的异步游标。如果回滚修改,在进行修改后打开的 STATIC 或 INSENSITIVE 游标将不再反映数据的状态。
当 SET CURSOR_CLOSE_ON_COMMIT 为 ON 时,ROLLBACK 语句关闭所有打开的游标。
当 SET CURSOR_CLOSE_ON_COMMIT 为 OFF 时,ROLLBACK 语句将关闭所有打开的游标,那些被定义为 INSENSITIVE 或 STATIC 的游标除外;但未完全填充的异步 STATIC 游标将关闭。如果回滚修改,在进行修改后打开的 STATIC 或 INSENSITIVE 游标将不再反映数据的状态。
SET CURSOR_CLOSE_ON_COMMIT 控制与 sp_dboption 的 cursor close on commit 数据库选项相同的行为。如果 CURSOR_CLOSE_ON_COMMIT 设置为 ON 或 OFF,则在连接上使用该设置。如果未指定 SET CURSOR_CLOSE_ON_COMMIT,则应用 sp_dboption 的 cursor close on commit 设置。
SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序均在连接时将 CURSOR_CLOSE_ON_COMMIT 设置为 OFF。DB-Library 不自动设置 CURSOR_CLOSE_ON_COMMIT 值。
当 SET ANSI_DEFAULTS 为 ON 时,将启用 SET CURSOR_CLOSE_ON_COMMIT。
SET CURSOR_CLOSE_ON_COMMIT 的设置是在执行或运行时设置,而不是在分析时设置。
SET CURSOR_CLOSE_ON_COMMIT 权限默认授予所有用户。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17032106/viewspace-705573/
,如需转载,请注明出处,否则将追究法律责任。