使用 SQL Server 时需要经常用到的几个设置选项
. set deadlock_priority<br/><br/>说明:控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。<br/><br/>语法:set deadlock_priority { low | normal | @deadlock_var }<br/><br/>参数:low 指定当前会话为首选死锁牺牲品。microsoft? sql server? 自动回滚死锁牺牲品的事务,并给客户端应用程序返回 1205 号死锁错误信息。<br/> normal 指定会话返回到默认的死锁处理方法。<br/> @deadlock_var 是指定死锁处理方法的字符变量。如果指定 low,则 @deadlock_var 为 3;如果指定 normal,则 @deadlock_var 为 6。<br/><br/>注释:set deadlock_priority 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:set deadlock_priority 权限默认授予所有用户。<br/><br/> <br/><br/>2. set lock_timeout<br/><br/>说明:指定语句等待锁释放的毫秒数。<br/><br/>语法:set lock_timeout timeout_period<br/><br/>参数:timeout_period 是在 microsoft? sql server? 返回锁定错误前经过的毫秒数。值为 -1(默认值)时表示没有超时期限(即无限期等待)。<br/> 当锁等待超过超时值时,将返回错误。值为 0 时表示根本不等待,并且一遇到锁就返回信息。<br/><br/>注释:在连接开始时,该设置的值为 -1。设置更改后,新设置在其余的连接时间里一直有效。<br/> set lock_timeout 的设置是在执行或运行时设置,而不是在分析时设置。<br/> readpast 锁定提示为该 set 选项提供了另一种方式。<br/><br/>权限:set lock_timeout 权限默认授予所有用户。<br/><br/>示例:下例将锁超时期限设置为 1,800 毫秒。<br/><br/> set lock_timeout 1800<br/> go<br/><br/> <br/><br/>3. @@lock_timeout<br/><br/>说明:返回当前会话的当前锁超时设置,单位为毫秒。<br/><br/>语法:@@lock_timeout<br/><br/>返回类型:integer<br/><br/>注释:set lock_timeout 允许应用程序设置语句等待阻塞资源的最长时间。当一条语句已等待超过 lock_timeout 所设置的时间,则被锁住的语句将自动取消,并给应用程序返回一条错误信息。<br/> 在一个连接的开始,@@lock_timeout 返回一个 –1值。<br/><br/>示例:下面的示例显示当一个 lock_timeout 值未被设置时的结果集。<br/><br/> select @@lock_timeout<br/> 下面是结果集:<br/> ----------------<br/> -1<br/><br/> 下面的示例设置 lock_timeout 为 1800 毫秒,然后调用 @@lock_timeout。<br/><br/> set lock_timeout 1800<br/> select @@lock_timeout<br/><br/> 下面是结果集:<br/> ------------------------------<br/> 1800<br/><br/> <br/><br/>4. set identity_insert<br/><br/>说明:允许将显式值插入表的标识列中。<br/><br/>语法:set identity_insert [ database.[ owner.] ] { table } { on | off }<br/><br/>参数:database 是指定的表所驻留的数据库名称。<br/> owner 是表所有者的名称。<br/> table 是含有标识列的表名。<br/><br/>注释:任何时候,会话中只有一个表的 identity_insert 属性可以设置为 on。如果某个表已将此属性设置为 on,并且为另一个表发出了 set identity_insert on 语句,则 microsoft? sql server? 返回一个错误信息,指出 set identity_insert 已设置为 on 并报告此属性已设置为 on 的表。<br/> 如果插入值大于表的当前标识值,则 sql server 自动将新插入值作为当前标识值使用。<br/> set identity_insert 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:执行权限默认授予 sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色以及对象所有者。<br/><br/>示例:下例创建一个含有标识列的表,并显示如何使用 set identity_insert 设置填充由 delete 语句导致的标识值中的空隙。<br/><br/> -- create products table.<br/> create table products (id int identity primary key, product varchar(40))<br/> go<br/> -- inserting values into products table.<br/> insert into products (product) values (screwdriver)<br/> insert into products (product) values (hammer)<br/> insert into products (product) values (saw)<br/> insert into products (product) values (shovel)<br/> go<br/><br/> -- create a gap in the identity values.<br/> delete products <br/> where product = saw<br/> go<br/><br/> select * <br/> from products<br/> go<br/><br/> -- attempt to insert an explicit id value of 3;<br/> -- should return a warning.<br/> insert into products (id, product) values(3, garden shovel)<br/> go<br/><br/> -- set identity_insert to on.<br/> set identity_insert products on<br/> go<br/><br/> -- attempt to insert an explicit id value of 3<br/> insert into products (id, product) values(3, garden shovel)<br/> go<br/><br/> select * <br/> from products<br/> go<br/><br/> -- drop products table.<br/> drop table products<br/> go<br/><br/> <br/><br/>5. set implicit_transactions<br/><br/>说明:为连接设置隐性事务模式。<br/><br/>语法:set implicit_transactions { on | off }<br/><br/>注释:当设置为 on 时,set implicit_transactions 将连接设置为隐性事务模式。当设置为 off 时,则使连接返回到自动提交事务模式。<br/> 当连接是隐性事务模式且当前不在事务中时,执行下列语句将启动事务:<br/><br/> alter table fetch revoke <br/> create grant select <br/> delete insert truncate table <br/> drop open update <br/><br/> 如果连接已经在打开的事务中,则上述语句不启动新事务。<br/> 对于因为该设置为 on 而自动打开的事务,用户必须在该事务结束时将其显式提交或回滚。否则当用户断开连接时,事务及其所包含的所有数据更改将回滚。在事务提交后,执行上述任一语句即可启动新事务。<br/> 隐性事务模式将保持有效,直到连接执行 set implicit_transactions off 语句使连接返回到自动提交模式。在自动提交模式下,如果各个语句成功完成则提交。<br/> 在进行连接时,sql server odbc 驱动程序和用于 sql server 的 microsoft ole db 提供程序自动将 implicit_transactions 设置为 off。对来自 db-library 应用程序的连接,set implicit_transactions 默认为 off。<br/> 当 set ansi_defaults 为 on 时,将启用 set implicit_transactions。<br/> set implicit_transactions 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>示例:下例演示在将 implicit_transactions 设置为 on 时显式或隐式启动事务。它使用 @@trancount 函数演示打开的事务和关闭的事务。<br/><br/> use pubs<br/> go<br/><br/> create table t1 (a int)<br/> go<br/> insert into t1 values (1)<br/> go<br/><br/> print use explicit transaction<br/> begin tran<br/> insert into t1 values (2)<br/> select tran count in transaction= @@trancount<br/> commit tran<br/> select tran count outside transaction= @@trancount<br/> go<br/><br/> print setting implicit_transactions on<br/> go<br/> set implicit_transactions on<br/> go<br/><br/> print use implicit transactions<br/> go<br/> -- no begin tran needed here.<br/> insert into t1 values (4)<br/> select tran count in transaction= @@trancount<br/> commit tran<br/> select tran count outside transaction= @@trancount<br/> go<br/><br/> print use explicit transactions with implicit_transactions on<br/> go<br/> begin tran<br/> insert into t1 values (5)<br/> select tran count in transaction= @@trancount<br/> commit tran<br/> select tran count outside transaction= @@trancount<br/> go<br/><br/> select * from t1<br/> go<br/><br/> -- need to commit this tran too!<br/> drop table t1<br/> commit tran<br/> go<br/><br/> <br/><br/>6. set nocount<br/>说明:使返回的结果中不包含有关受 transact-sql 语句影响的行数的信息。<br/><br/>语法:set nocount { on | off } <br/><br/>注释:当 set nocount 为 on 时,不返回计数(表示受 transact-sql 语句影响的行数)。当 set nocount 为 off 时,返回计数。<br/> 即使当 set nocount 为 on 时,也更新 @@rowcount 函数。<br/> 当 set nocount 为 on 时,将不给客户端发送存储过程中的每个语句的 done_in_proc 信息。当使用 microsoft? sql server? 提供的实用工具执行查询时,在 transact-sql 语句(如 select、insert、update 和 delete)结束时将不会在查询结果中显示"nn rows affected"。<br/> 如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。<br/> set nocount 设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:set nocount 权限默认授予所有用户。<br/><br/>示例:下例在 osql 实用工具或 sql server 查询分析器中执行时,可防止显示有关受影响的行数的信息。<br/><br/> use pubs<br/> go<br/> -- display the count message.<br/> select au_lname <br/> from authors<br/> go<br/> use pubs<br/> go<br/> -- set nocount to on and no longer display the count message.<br/> set nocount on<br/> go<br/> select au_lname <br/> from authors<br/> go<br/> -- reset set nocount to off.<br/> set nocount off<br/> go<br/><br/> <br/><br/>7. @@rowcount<br/>说明:返回受上一语句影响的行数。<br/><br/>语法:@@rowcount<br/><br/>返回类型:integer<br/><br/>注释:任何不返回行的语句将这一变量设置为 0 ,如 if 语句。<br/><br/>示例:下面的示例执行 update 语句并用 @@rowcount 来检测是否有发生更改的行。<br/><br/> update authors set au_lname = jones<br/> where au_id = 999-888-7777<br/> if @@rowcount = 0<br/> print warning: no rows were updated<br/><br/> <br/><br/>8. set rowcount<br/><br/>说明:使 microsoft? sql server? 在返回指定的行数之后停止处理查询。 <br/><br/>语法:set rowcount { number | @number_var } <br/><br/>参数:number | @number_var 是在停止给定查询之前要处理的行数(整数)。<br/><br/>注释:建议将当前使用 set rowcount 的 delete、insert 和 update 语句重新编写为使用 top 语法。有关更多信息,请参见 delete、insert 或 update。<br/> 对于在远程表和本地及远程分区视图上执行的 insert、update 和 delete 语句,忽略 set rowcount 选项设置。<br/> 若要关闭该选项(以便返回所有的行),请将 set rowcount 指定为 0。<br/> 说明 设置 set rowcount 选项将使大多数 transact-sql 语句在已受指定数目的行影响后停止处理。这包括触发器和 insert、update 及 delete 等数据修改语句。rowcount 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 select 语句一起使用。<br/> 如果行数的值较小,则 set rowcount 替代 select 语句 top 关键字。<br/> set rowcount 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:set rowcount 权限默认授予所有用户。<br/><br/>示例:set rowcount 在指定的行数后停止处理。在下例中,注意有 x 行满足预付款少于或等于 $5,000 的条件;但是,从更新所返回的行数中可以看出并非所有的行都得到处理。rowcount 影响所有的 transact-sql 语句。<br/><br/> use pubs<br/> go<br/> select count(*) as cnt<br/> from titles <br/> where advance >= 5000<br/> go<br/><br/> 下面是结果集:<br/><br/> cnt <br/> ----------- <br/> 11 <br/><br/> (1 row(s) affected)<br/><br/> 现在,将 rowcount 设置为 4,并更新预付款等于或大于 $5,000 的所有行。<br/><br/> -- set rowcount to 4.<br/> set rowcount 4<br/> go<br/> update titles<br/> set advance = 5000<br/> where advance >= 5000<br/> go<br/><br/> <br/><br/>9. set transaction isolation level<br/>说明:控制由连接发出的所有 microsoft? sql server? select 语句的默认事务锁定行为。<br/><br/>语法:set transaction isolation level<br/> { read committed<br/> | read uncommitted<br/> | repeatable read<br/> | serializable <br/> }<br/><br/>参数:read committed 指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 sql server 的默认值。<br/> read uncommitted 执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 nolock 相同。这是四个隔离级别中限制最小的级别。<br/> repeatable read 锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。<br/> serializable 在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 select 语句中的所有表上设置 holdlock 相同。<br/><br/>注释:一次只能设置这些选项中的一个,而且设置的选项将一直对那个连接保持有效,直到显式更改该选项为止。这是默认行为,除非在语句的 from 子句中在表级上指定优化选项。<br/> set transaction isolation level 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>示例:下例为会话设置 transaction isolation level。对于每个后续 transact-sql 语句,sql server 将所有共享锁一直控制到事务结束为止。<br/><br/> set transaction isolation level repeatable read<br/> go<br/> begin transaction<br/> select * from publishers<br/> select * from authors<br/> ...<br/> commit transaction<br/><br/> <br/><br/>10. set xact_abort<br/><br/>说明:指定当 transact-sql 语句产生运行时错误时,microsoft? sql server? 是否自动回滚当前事务。<br/><br/>语法:set xact_abort { on | off }<br/><br/>注释:当 set xact_abort 为 on 时,如果 transact-sql 语句产生运行时错误,整个事务将终止并回滚。为 off 时,只回滚产生错误的 transact-sql 语句,而事务将继续进行处理。编译错误(如语法错误)不受 set xact_abort 的影响。<br/> 对于大多数 ole db 提供程序(包括 sql server),隐性或显式事务中的数据修改语句必须将 xact_abort 设置为 on。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 <br/> set xact_abort 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>示例:下例导致在含有其它 transact-sql 语句的事务中发生违反外键错误。在第一个语句集中产生错误,但其它语句均成功执行且事务成功提交。在第二个语句集中,set xact_abort 设置为 on。这导致语句错误使批处理终止,并使事务回滚。 <br/><br/> create table t1 (a int primary key)<br/> create table t2 (a int references t1(a))<br/> go<br/> insert into t1 values (1)<br/> insert into t1 values (3)<br/> insert into t1 values (4)<br/> insert into t1 values (6)<br/> go<br/> set xact_abort off<br/> go<br/> begin tran<br/> insert into t2 values (1)<br/> insert into t2 values (2) /* foreign key error */<br/> insert into t2 values (3)<br/> commit tran<br/> go<br/><br/> set xact_abort on<br/> go<br/><br/> begin tran<br/> insert into t2 values (4)<br/> insert into t2 values (5) /* foreign key error */<br/> insert into t2 values (6)<br/> commit tran<br/> go<br/><br/> /* select shows only keys 1 and 3 added. <br/> key 2 insert failed and was rolled back, but<br/> xact_abort was off and rest of transaction<br/> succeeded.<br/> key 5 insert error with xact_abort on caused<br/> all of the second transaction to roll back. */<br/><br/> select * <br/> from t2<br/> go<br/><br/> drop table t2<br/> drop table t1<br/> go<br/>
页:
[1]