并发与锁

jxwangjm 2014-10-02 05:57:53
create table st_gvar (aid int indentity(1,1) primary key,fvalue varchar(10));
insert into st_gvar (fvalue) values ('');
select max(aid) as c1 from st_gvar;

假如有两个人(A和B)同时执行insert操作,导致A得到B的记录,而B也得到B的记录?


...全文
82 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
习惯性蹭分 2014-10-04
  • 打赏
  • 举报
回复
不加事务会时A,B都会取到最大的,加了事务就不会,你自己可以测试一下。 开两个会话,下面waitfor time 时间自己可以调整。


--if object_id('test') is not null
--drop table test
--create table  test(id int identity(1,1) not null primary key,
--val varchar(30))

--begin tran
waitfor time '10:18:00'
insert into test
values('')
select max(id) from  test
   --commit
卖水果的net 版主 2014-10-04
  • 打赏
  • 举报
回复


insert into st_gvar (fvalue) values ('');
-- select max(aid) as c1 from st_gvar;  不用这个
select @@IDENTITY -- 用这个,两个会话互不影响,A先执行A 行到 1,B后执行, B得到的是 2 。

jxwangjm 2014-10-04
  • 打赏
  • 举报
回复
引用 4 楼 tangguangqiang 的回复:
不加事务会时A,B都会取到最大的,加了事务就不会,你自己可以测试一下。 开两个会话,下面waitfor time 时间自己可以调整。


--if object_id('test') is not null
--drop table test
--create table  test(id int identity(1,1) not null primary key,
--val varchar(30))

--begin tran
waitfor time '10:18:00'
insert into test
values('')
select max(id) from  test
   --commit
我用begin tran,但不加commit tran 应该是死锁,因为会话A中max函数需要处理所有行,但会话B中insert至少会锁定某一行
jxwangjm 2014-10-04
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:


insert into st_gvar (fvalue) values ('');
-- select max(aid) as c1 from st_gvar;  不用这个
select @@IDENTITY -- 用这个,两个会话互不影响,A先执行A 行到 1,B后执行, B得到的是 2 。

这个应该是最好的方式
ACMAIN_CHM 2014-10-03
  • 打赏
  • 举报
回复
如果没有事务控制,则可能会导致 select max(aid) as c1 from st_gvar; 是B已经插入后的数据。
专注or全面 2014-10-02
  • 打赏
  • 举报
回复
不会的,有一个先取得表级排他所,待释放后,另外一个会话才能开始

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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