一个数据库锁方面的问题问题

Daniel22_cn 2004-12-23 03:12:07
我现在有一段代码

string szOutput
string ValueData
ValueData = "Something"

select ColumnName into :szOutput
From TableName where ParmName = :ValueData;

IF (boolean)
-----code
else
---- code
end if

Update TableName Set Counter = Counter + 1
where paramname = :valuedata;

很多客户端会同时运行,这个时候则取值会出现问题,因此需要在此段代码访问的时候使用独占式访问。在定义Transaction Object的时候,Lock给的是RU,更改成如下代码后同时只能启动一个客户端,产生了数据库锁死,并且应用程序提交的数据库无法被正确保存(报告正确保存,但实际上没有)
更改后的代码如下:
string szSQL
szSQL = "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE" --设置可串行化的隔离级别
Execute ...
szSQL = "begin tran"
Execute ...
select columnname from tablename where option=abc
//其他语句
update tablename set columnname = abc
szSQL = "commit tran"
Execute ...
szSQL = "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" --恢复默认的隔离级别
Execute...

请教,我怎么解决这个问题,如何给数据库正确锁,又能保证PB代码执行正确,并且可以同时启动多个实例。
...全文
94 点赞 收藏 8
写回复
8 条回复
dbaren 2004年12月29日
string szSQL
szSQL = "begin tran"
Execute ...
select columnname from tablename where option=abc
//其他语句
update tablename set columnname = abc
szSQL = "commit tran"
Execute ...
就行了,sqlserver自动从begin tran 开始加锁,从commit tran 执行完后解锁
回复 点赞
Daniel22_cn 2004年12月29日
我已经使用存储过程解决此问题。
在调用存储过程之前执行sqlca.autocommit = ture
执行完成之后执行autocommit=false

给分了~
回复 点赞
icanflyfast 2004年12月25日
execute immediate "begin trans"
第一句应该为update tablename set ..... where ....这样可以马上对tablename产生一个排他锁,直接限制其他用户的操作
execute immediate "commit trans"
提交后 the EX lock is released and the table is available to other users' operation
回复 点赞
Daniel22_cn 2004年12月24日
我已经commit了,大家看到了 Commit tran的语句了吗?

即使Commit,依然存在第二个程序实例无法工作的现象。

拜托,看一下我的代码再说话,OK?
回复 点赞
qyqtn 2004年12月24日
更新成功则commit;
否则rollback;
回复 点赞
ouyangwu 2004年12月23日
关注中!
回复 点赞
zhangdatou 2004年12月23日
每一次运行都commit
回复 点赞
青锋-SS 2004年12月23日
及时commit;
回复 点赞
发动态
发帖子
脚本语言
创建于2007-09-28

462

社区成员

8033

社区内容

PowerBuilder 脚本语言
社区公告
暂无公告