全局临时表支不支持事务?

ShapeRock 2003-10-16 03:27:02
如:一个过程中用了begin tran,然后修改了全局临时表,这时另一个用户可不可以在另一个过程中修改全局临时表。
问题2:一个过程一运行就开始了begin tran,过程没执行完,另一个用户也调用了此过程,那么第二个用户是不是等到第一个用户commit tran后才开始执行这个过程?
...全文
65 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
6HZ 2003-10-16
  • 打赏
  • 举报
回复
问题一:这要看你在处理这个临时表时加什么数据锁,这样做比较影响性能;
问题二:你说的对,但事务保证数据处理的完整性,不处理数据的并发操作。
zjcxc 2003-10-16
  • 打赏
  • 举报
回复
建议最好不用全局临时表.
zjcxc 2003-10-16
  • 打赏
  • 举报
回复
--创建一个全局临时表:
create table ##tb(a int,b int)

--然后开启两个连接,执行下面的语句:
begin tran
insert into ##tb values(1,1)

select * from ##tb

/*--结果:
第一个连接可以正常执行完成.

第二个连接中,执行前两句没问题,第三句被挂起.

当在第一个连接中,提交或回滚事务,则第二个连接的第三句就执行了.
--*/



pengdali 2003-10-16
  • 打赏
  • 举报
回复
有个变通的办法:

create proc 内部过程
@tablename varchar(100) output
as
declare @a varchar(100)
set @a=newid()
exec('select * into [##'+@a+'] from xx')
set @tablename=@a
go

create proc 调用过程
as
declare @a varchar(100)
exec 内部过程 @a output

exec('select * from [##'+@a']')
pengdali 2003-10-16
  • 打赏
  • 举报
回复
1 如何锁一个表的某一行


A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10' where id=3 --则要等待5秒

update tablename set colname='10' where id<>3 --可立即执行

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)


注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
ShapeRock 2003-10-16
  • 打赏
  • 举报
回复
to: pengdali(大力 V3.0)
偶想通过事务让每个用户都能按先后顺序调用这个全局临时表。虽然这影响速度,但速度无关紧要。
ShapeRock 2003-10-16
  • 打赏
  • 举报
回复
晕,大力,你信誉分怎么551了。比偶专家分都高。哈,想再确认一下。
sdhdy 2003-10-16
  • 打赏
  • 举报
回复
第二个用户要等到第一个用户commit tran后才开始执行这个过程
pengdali 2003-10-16
  • 打赏
  • 举报
回复
我不是让你不要用全局临时表吗?它不好,你的过程不可能只有一个人使用。

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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