请教一个关于锁和事物的问题

helianus 2015-08-19 02:57:37
加精
begin TranA

insert A或者 update A或者deleteA

end

begin TranB

select A

end

现在楼主的疑问就是表A被加了排他锁,那么我事物A在还没commit的情况下。我调用了事物B对表A可以进行查询么?
实际情况lz试了一下好像是事物B一直在阻塞着。。

然后我改了一下代码
begin TranA

insert A或者 update A或者deleteA
select A

end

然后这个时候好像就可以对selectA查数据了。请问这是为什么?
来个高人给梳理一下呗。
...全文
1348 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南雪_158 2015-08-25
  • 打赏
  • 举报
回复
学习一下
伊顺鸣 2015-08-24
  • 打赏
  • 举报
回复
来学习呢。。。。
xiaoxiangqing 2015-08-23
  • 打赏
  • 举报
回复
是这样的,更新,删除,新增都会加排它锁。
gw6328 2015-08-21
  • 打赏
  • 举报
回复
同一个事务里面没有什么排它啊。所以能查只是执行先后
dong127 2015-08-21
  • 打赏
  • 举报
回复
如果只是查询被锁定表中其他条件的数据而言,是非常实用的
dong127 2015-08-21
  • 打赏
  • 举报
回复
对于被锁定表的查询操作,也可以使用nolock关键字, 比如: select * from 表A with (nolock) 这样的好处是就算表A被锁定,也是可以查询出数据,唯一的问题是查询到的数据只是锁定以前的数据,事务中的一些变更是查不到的,除非等到事务commit tran之后...
misterliwei 2015-08-21
  • 打赏
  • 举报
回复
引用 14 楼 dong127 的回复:
对于被锁定表的查询操作,也可以使用nolock关键字, 比如: select * from 表A with (nolock) 这样的好处是就算表A被锁定,也是可以查询出数据,唯一的问题是查询到的数据只是锁定以前的数据,事务中的一些变更是查不到的,除非等到事务commit tran之后...
不是事务前的值,而是事务中——也就是当前值,也就是脏读。
加油馒头 2015-08-21
  • 打赏
  • 举报
回复
默认锁机制,不脏读,所以在select的时候,如果有更新 就会阻塞
Tiger_Zhao 2015-08-20
  • 打赏
  • 举报
回复
这是默认级别。
我之所以不说隔离级别,因为那个展开来就复杂了。
新手只要记住:(默认级别下)锁定会影响别的会话不影响当前会话。
helianus 2015-08-20
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
这个主要跟事务隔离等级有关,建议了解一下. 此外,还跟表字段数据类型,表数据量,索引等因素有关, LZ需给具体的测试SQL语句才好给你解释.
● 授权读取(读提交)(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 我想我应该是找到原因了,我上面一个例子中因为是未提交的,所以另外一个事物读取记录确实是被前一个事物所阻塞了
董小姐_123 2015-08-20
  • 打赏
  • 举报
回复
引用 8 楼 helianus 的回复:
[quote=引用 5 楼 Tiger_Zhao 的回复:] [Quote=引用 2 楼 helianus 的回复:]大神可以说的稍微具体点么? [/Quote] 所谓的“锁”其实就是一个占用标记,把一个数据占下来让别的会话不能动,但是自己会话可以随意动(包括增删改查)——自己动本来就是加锁的目的啊。 至于其它会话查询要等待,虽然不动数据,但是是为了数据的完整性,才会等递交或回滚后再读取。
好吧,反正现在就是同一个事物里面对一个对象上了x锁,操作完成之后就立即释放了资源。就是这么回事了对吧[/quote] 赞同
helianus 2015-08-20
  • 打赏
  • 举报
回复
引用 12 楼 Tiger_Zhao 的回复:
这是默认级别。 我之所以不说隔离级别,因为那个展开来就复杂了。 新手只要记住:(默认级别下)锁定会影响别的会话不影响当前会话。
感谢!~
nettman 2015-08-19
  • 打赏
  • 举报
回复
关注下
helianus 2015-08-19
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
[Quote=引用 2 楼 helianus 的回复:]大神可以说的稍微具体点么? [/Quote] 所谓的“锁”其实就是一个占用标记,把一个数据占下来让别的会话不能动,但是自己会话可以随意动(包括增删改查)——自己动本来就是加锁的目的啊。 至于其它会话查询要等待,虽然不动数据,但是是为了数据的完整性,才会等递交或回滚后再读取。
好吧,反正现在就是同一个事物里面对一个对象上了x锁,操作完成之后就立即释放了资源。就是这么回事了对吧
helianus 2015-08-19
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
这个主要跟事务隔离等级有关,建议了解一下. 此外,还跟表字段数据类型,表数据量,索引等因素有关, LZ需给具体的测试SQL语句才好给你解释.
不好意思哦,我一楼写的伪代码只是lz后台代码对于数据库访问的大概逻辑。真要贴代码的话还是蛮长的。。
helianus 2015-08-19
  • 打赏
  • 举报
回复
引用 3 楼 misterliwei 的回复:

begin TranA
insert  A或者 update  A或者deleteA
end  <-------
begin TranB
select A
end <-------
这里的两处END 是什么? BEGIN TRAN 不是和COMMIT或ROLLBACK配对的吗?
啊,不好意思。这个伪代码写的不严谨,简单的来说这是两个事物么,只是一个事物为提交的情况下。另外一个事物对加了锁的表A进行查询
Tiger_Zhao 2015-08-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 helianus 的回复:]大神可以说的稍微具体点么? [/Quote]
所谓的“锁”其实就是一个占用标记,把一个数据占下来让别的会话不能动,但是自己会话可以随意动(包括增删改查)——自己动本来就是加锁的目的啊。
至于其它会话查询要等待,虽然不动数据,但是是为了数据的完整性,才会等递交或回滚后再读取。
唐诗三百首 2015-08-19
  • 打赏
  • 举报
回复
这个主要跟事务隔离等级有关,建议了解一下. 此外,还跟表字段数据类型,表数据量,索引等因素有关, LZ需给具体的测试SQL语句才好给你解释.
misterliwei 2015-08-19
  • 打赏
  • 举报
回复

begin TranA
insert  A或者 update  A或者deleteA
end  <-------
begin TranB
select A
end <-------
这里的两处END 是什么? BEGIN TRAN 不是和COMMIT或ROLLBACK配对的吗?
helianus 2015-08-19
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
不同会话的锁才会等待,自己会话的锁没影响。
大神可以说的稍微具体点么?
加载更多回复(1)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧