pb11 -- PB12 查询数据时死锁问题解决办法<转>

一、 原先PB11中连接方式是:
// Profile iadserver
SQLCA.DBMS = "OLE DB"
SQLCA.LogPass =profilestring('dbms.ini' , "database" , "logpass" , "")
SQLCA.LogId = profilestring('dbms.ini', "database" , "logid" , "")
SQLCA.AutoCommit = False
SQLCA.DBParm = "PROVIDER='SQLOLEDB',"+&
"DATASOURCE='" + profilestring('dbms.ini' , "database" , "serverip" , "") + "'," +&
"PROVIDERSTRING='Database="+profilestring('dbms.ini' , "database" , "dbname" , "")+"'"

connect using sqlca ;
if SQLCA.SQLCode <> 0 then
messagebox("提示信息:", '连接数据库出错!' + SQLCA.SQLErrText , stopsign!)
rollback using sqlca ;
halt close
end if

二、经高人指点后的连接方式
用以上连接方式,经常在查询的时候都死锁,没有办法,在查询完成后都要COMMIT,后来有位高人指点,增加了

加上sqlca.lock='RU' 或者 sqlca.lock='RC' 可以解决死锁问题。

具体连接方式如下:
// Profile iadserver
SQLCA.DBMS = "OLE DB"
SQLCA.LogPass =profilestring('dbms.ini' , "database" , "logpass" , "")
SQLCA.LogId = profilestring('dbms.ini', "database" , "logid" , "")
SQLCA.AutoCommit = False

SQLCA.Lock='RC'
SQLCA.DBParm = "PROVIDER='SQLOLEDB',"+&
"DATASOURCE='" + profilestring('dbms.ini' , "database" , "serverip" , "") + "'," +&
"PROVIDERSTRING='Database="+profilestring('dbms.ini' , "database" , "dbname" , "")+"'"

connect using sqlca ;
if SQLCA.SQLCode <> 0 then
messagebox("提示信息:", '连接数据库出错!' + SQLCA.SQLErrText , stopsign!)
rollback using sqlca ;
halt close
end if

三、 MS SQL中lock属性
RU Read Uncommitted
RC Read Committed
RR Repeatable Read
TS Serializable
查阅SQL SERVER2005联机丛书有以下描述:
sql server 数据库引擎隔离级别
SQL-99 标准定义了下列隔离级别,Microsoft SQL Server Database Engine 支持所有这些隔离级别:
未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据)
已提交读(数据库引擎 的默认级别)
可重复读
可序列化(隔离事务的最高级别,事务之间完全隔离)
实际测试发现,当设置sqlca.lock='RR'可重复读时,会出现死锁,其他三种不会。

似乎PB10以上版本缺省是sqlca.lock='RR'才会造成死锁,一般是用“RC”。
低版本的PB用MS SQLSERVER连接时的默认级别,适用于大多数情况,当然还要看你的具体应用了。

posted on 2012-09-04 14:17  账号难注册  阅读(1106)  评论(0编辑  收藏  举报