首先执行begin tran
select * from school with(xlock)
在事物内对表school申请排它锁
begin tran
select * from school 又一个事务对表school执行查询,按道理来说执行查询要对查询的数据申请共享锁,那么此查询会被阻塞(因为两个事务都还没有提交也没有回滚),但是第二个事务并没有造成阻塞,查询顺利执行,难道第二个事务的查询没有申请共享锁?另外数据库没有建立任何索引,也没有开启任何快照
select * from school with(xlock)
在事物内对表school申请排它锁
begin tran
select * from school 又一个事务对表school执行查询,按道理来说执行查询要对查询的数据申请共享锁,那么此查询会被阻塞(因为两个事务都还没有提交也没有回滚),但是第二个事务并没有造成阻塞,查询顺利执行,难道第二个事务的查询没有申请共享锁?另外数据库没有建立任何索引,也没有开启任何快照
解决方案 »
- sql server和interbase优劣势对比,谢谢
- 怎样通过VS 调用数据库中的数据并画出折线图
- 简单的两表查重
- 全表搜索如何做?
- 存储过程编写 触发器利用,兼顾散分
- SQL可以存放图片文件吗
- 高手帮忙看看这个存储过程那里错
- 一个表A其中两个字段是nameid1,nameid2,都对应表B的id字段。
- COM事务中执行 select 或者 insert into 出现'灾难性错误', 导致服务器重新启动
- 一台数据库服务器有200个数据库,能做双机热备吗,镜像的话有个数限制,跑不起来,有什么好方法
- 寻 (爱新觉罗.毓华) 帮忙在给我看下啊! 只有你才能搞定
- 北大青鸟广力告诉你关于SQL Server数据库实用小技巧集合
select * from school with(xlock,HOLDLOCK)这样就会保持锁了
注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
一个新建的表(从未被 update 过),如果使用 select 语句查询,select 语句将不会请求 S 锁。
但是,一旦在此表上发生过阻塞后,SQL SERVER 像想通了一样,以后查询此表的 select 语句将会请求 S 锁。
例如,-- 新建一表
create table tb (id int identity, c char(10));
go
insert into tb(c)
select 'a' union all select 'b';
go-- 会话一中执行 select 查询,不会请求 s 行锁
select * from tb;-- 会话二中
begin tran
update tb set c='x';-- 会话一中执行 select 查询,产生阻塞
select * from tb;-- 会话二中回滚事务,释放锁
rollback tran;-- 再在 会话一中执行 select 查询,将会请求 s 行锁
select * from tb;
又但是,如果这个表创建在 TEMPDB 数据库上,查询此表的 select 语句始终会请求 S 锁。不知道是微软为性能故意而为,还是其他(SQL SERVER 2005 和 2008 上使用 SQL Profiler 测试)
另外想问下在SQL Profiler 怎么查看申请锁的类型
在申请页锁或者表锁时会阻塞,或者如2楼所说把X锁加在表上或页上也会阻塞
反正把X锁加在行上,或者申请的锁是行锁都不会阻塞
2000或以前版本,默认是加锁的
2005以上版本,要看你的事务隔离机制是设置的快照还是别的.快照的时候,是不加所的
及里面的链接。
http://www.cnblogs.com/nzperfect/archive/2010/02/25/1673667.html
加菲大哥我知道为啥结果和你不一样了,请看rollback tran后面的注释,这问题太复杂了....-- 新建一表
create table tb (id int identity, c char(10));
go
insert into tb(c)
select 'a' union all select 'b';
go-- 会话一中执行 select 查询,不会请求 s 行锁
select * from tb;-- 会话二中
begin tran
update tb set c='x';-- 会话一中执行 select 查询,产生阻塞
select * from tb;-- 会话二中回滚事务,释放锁
rollback tran;--这儿貌似用commit,以后查询还是不会申请S锁,但是该为rollback以后就会申请S锁了-- 再在 会话一中执行 select 查询,将会请求 s 行锁
select * from tb;