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

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代码执行正确,并且可以同时启动多个实例。
...全文
133 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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;

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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