有数据表A,用户X在SELECT ,UPDATE等 A的记录之前,设置对A的独占方式打开,此时任何其他用户在对这张表访问之前会先询问是否已经被独占打开,若独占打开则不能作任何操作,X操作结束之后取消独占,其他用户才可以访问此表1。设置独占打开一张表
2。获取表的状态请问各位高手,SQL 里面是否有这样的语句?
2。获取表的状态请问各位高手,SQL 里面是否有这样的语句?
解决方案 »
- 2表的复杂sql问题
- 视图中大概100万掉记录,怎么把数据存储成数据表
- 一个存储过程的输出参数值如何传给另一个存储过程
- Microsoft][ODBC SQL Server Driver]超时已过期
- sql server 和 access 中带短杠(-)的字符串排序异常
- SQL2005语法问题,求助。
- 为什么这个动态模糊查询总是丢掉了末尾的%'
- 自定义函数出现的问题
- 如何用存储过程将MS SQL SERVER 6.5数据库服务器A上的某数据库中的表a的数据备份到MS SQL SERVER 6.5数据库服务器B上的某数据库中的表b中
- DOS下怎么用BC3.1访问ORACLE?
- sql2000 递归
- SQL系统表
select * from tb with (TABLOCKX)
with (xlock tablock) --定义锁级别+锁范围要判断表状态 sp_lock再过滤objectid可以得到一行或多行rid/pag/tab/db级的数据 这个recordset你拿到也不好操作
可以在事务开头加上UPDATE TABLE SET ID=ID来对表加锁。
HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。
NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。
PAGLOCK 在通常使用单个表锁的地方采用页锁。
READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。
READUNCOMMITTED 等同于 NOLOCK。
REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。
ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。
SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。
TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。
UPDLOCK 读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度
52 1 85575343 0 TAB IS GRANT
52 1 85575343 2 KEY (a802b526c101) RangeS-S GRANT
52 6 661577395 0 TAB X GRANT
52 1 85575343 2 KEY (760094527148) RangeS-S GRANT
52 1 85575343 2 KEY (7f00d0d5506b) RangeS-S GRANT
52 1 85575343 2 KEY (c300d27116cf) RangeS-S GRANT
52 1 85575343 2 KEY (0701fdd03550) RangeS-S GRANT
52 1 85575343 2 KEY (54013f7c6be5) RangeS-S GRANT
52 1 85575343 2 KEY (bc0096b55f46) RangeS-S GRANT
52 1 85575343 2 PAG 1:1482 IS GRANT
52 1 85575343 2 KEY (b200dbb63a8d) RangeS-S GRANT
52 1 85575343 2 KEY (49014dc93755) RangeS-S GRANT
52 1 85575343 2 KEY (2802f6d3696b) RangeS-S GRANT
52 1 85575343 2 KEY (170130366f3d) RangeS-S GRANT
52 1 85575343 2 KEY (0701d0ff1b6e) RangeS-S GRANT
52 1 85575343 2 KEY (ca008636d9c0) RangeS-S GRANT
52 1 85575343 2 KEY (1101ed75c8f8) RangeS-S GRANT
54 6 0 0 DB S GRANT
2〉〉
这个事物,跟C# Ado的Transaction是否会冲突?
用了SQL的事物,是不是里面不能嵌套ADO的事物了?
BEGIN TRANSACTIONselect * from tb_user with (TABLOCKX)
还有个小问题,在锁定期间,好像不用每一句话都要加上WITH (TABLOCKX)吧?只要第一句话有了就可以?
是否有别的方式来开启这个标志?类似于USE TABLE WITH LOCK....这样的?
不用每句话都加,否则这样就要改很多代码了
这玩意儿,没法加查询条件,要在程序里面逐条判断,很不爽的
这样也可以起到锁表的作用。
set transaction isolation level serialiablebegin tran
select * from tablePinsert/update...commit tran set选项设置对当前连接所有SELECT一直启效 在查询更新插入操作完成之前 表被锁定(Select之后S锁不释放)
从你的需求来说
1.事务解决不可靠的(事务是行级锁定,对你这根本不使用)
2.12楼做标记方法,是可以的(用存储过程实现,一条sql语句实现不了,标记用全局变量@@xxx)
-- 并发问题,这里要自己定义一个循环+标记 来阻塞,等上次操作完下面的操作才能开发.
3.锁定表也是可行的(存储过程实现,一条sql语句实现不了.lock table unlock table )
总的来说这个.
-- 这个没问题,在mysql(sql server里面我不太清楚)里面锁定表后 并发操作会自动等前面解锁后在操作.