多人使用下如何安全动态创建数据表? |
缺席
|
mustapha.wang
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
如果系统是多人使用同一个数据库,程序需要动态建立数据表,要求为: 1、如果存在就不要创建了; 2、不存在才创建。 我们先作试验,创建的SQL如下: if exists (select * from dbo.sysobjects where id = CREATE TABLE [dbo].[wxhtest] ( ALTER TABLE [dbo].[wxhtest] WITH NOCHECK ADD ALTER TABLE [dbo].[wxhtest] ADD CREATE UNIQUE INDEX [IX_wxhtest] ON [dbo].[wxhtest] 在一个循环里面反复执行这样的SQL,会先判断是否存在,存在就drop,然后再建。开启连个以上的exe执行,一会儿就会报“表wxhTest已经存在”的错误。因为判断和创建会被打断,A刚刚drop,B刚好就判断为没有表,A创建,然后B也创建,就出错了。 procedure TForm1.Button1Click(Sender: TObject); 如果我们再加上Transaction,看是否有改善。 procedure TForm1.Button1Click(Sender: TObject); 开启3个exe,跑一会儿,还是出现错误“事务(进程ID55)与另一个进程已被锁死在Lock资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。”
------
江上何人初见月,江月何年初照人 |
mustapha.wang
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
我想问题还是一样的,就是判断和创建会被别的Transaction打断,跟一般的线程冲突一样,就决的方法是加锁,在Transaction完成前,不能让别的Tranaction来读sysobjects表。比如: procedure TForm1.Button1Click(Sender: TObject); 开启3个exe执行良久没有错误。因为锁了整个表,执行起来感觉明显慢了。 这种方法是否是大家常用的方式或应该使用的方式呢?
------
江上何人初见月,江月何年初照人 |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你好,不知为何你需要不停的drop table,然后再create,是什么目的?
为何不使用 truncate table,这样index和identity也会回复。 或者用delete dbcc CHECKIDENT。 不知你是否因为 Idenitity的问题所以才drop 又create? 当然你最后的那个lock sys table的方式是可行的,但非必要的话还是找别的方法达成想要的目标。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
mustapha.wang
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |