Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
防止其它并发事务访问或修改表。
LOCK TABLE table-name [ WITH HOLD ] IN { SHARE | EXCLUSIVE } MODE
table-name 表的名称。表必须是基表,而不是视图。因为临时表数据是当前连接的本地数据,所以锁定全局临时表或本地临时表都无效。
WITH HOLD 子句 指定此子句可将表锁定,直到连接结束时为止。如果未指定此子句,则提交或回退当前事务时将释放锁定。
IN SHARE MODE 子句 指定此子句可获取表上的共享表锁,从而阻止其它事务修改此表,但允许它们对此表进行读取访问。如果事务在表上放置了共享锁,则它可以修改表中的数据,前提是没有其它事务持有对所修改行的任意类型的锁。选择 IN SHARE MODE 子句后,不会再逐行设置读锁定。
IN EXCLUSIVE MODE 子句 指定此子句可获取表上的独占表锁,从而阻止其它事务访问此表。任何其它事务都不能对该表执行查询、更新或任何其它操作。如果使用语句(例如 LOCK TABLE...IN EXCLUSIVE MODE)以独占方式锁定表,则缺省行为是不获取表的行锁定。通过将 subsume_row_locks 选项设置为 Off 可以禁用此行为。
LOCK TABLE...IN EXCLUSIVE MODE
LOCK TABLE 语句允许直接控制表级并发,与当前的隔离级别无关。
虽然事务的隔离级别通常控制当前事务执行请求时设置的锁的种类,但 LOCK TABLE 语句允许更显式地控制表行的锁定。
不能对视图执行 LOCK TABLE 语句。但是,如果对基表执行 LOCK TABLE 语句,就会创建一个共享模式锁,它会锁定相关的视图。共享模式锁会一直存在,直到事务被提交或回退为止。
若要以 SHARE 模式锁定表,需要 SELECT 权限。
若要以 EXCLUSIVE 模式锁定表,则必须是表所有者或者有 DBA 权限。
需要访问锁定表的其它事务可能被延迟或阻塞。
SQL/2008 服务商扩充。
以下语句禁止其它事务在当前事务期间修改 Customers 表:
LOCK TABLE Customers IN SHARE MODE;