pb9和mssql2000死锁问题

6 篇文章 0 订阅
1 篇文章 0 订阅

1、前台开发工具pb9 8836

2、数据库mssql2000 Personal Edition 8.0.2039,已经打好sp4补丁,

3、os :windows server2012 r2,

连接人数不超过10,

但是有几个问题,

a、dw 里面select 全表,所以数据很大,我也不想修改他的其他过滤窗口,查询自然也没有改,所以每次开窗口很慢,

还经常死锁,(pb6.5的程序不死锁,好奇怪),很多select 都添加 nolock,还是有死锁,

b、后台很多触发器,和存储过程,取系统时间也用存储过程,

有时间把上面的问题改良一下,数据处理速度快一点,在网上找到处理死锁的资料如下:

--*****************************************************************************************************************

https://www.cnblogs.com/Aiolos/p/5174419.html
1. 即时的commit和rollback

不同数据库的锁机制各不相同,但对应用程序来说,造成死锁的最大可能就是:没有养成对每个 COMMIT 的执行结果进行检查的编码习惯,导致提交出错时未能及时 ROLLBACK 造成死锁。

示例代码:

sqlca.autocommit=false //一定要设置为不自动提交
string ls_err

dec ldec_xxx
select column_xxx into :ldec_xxx from TABLE_yyy where id=keyvalue; //如果有必要查询当前值的话.
if sqlca.sqlcode <0 then
   ls_err=sqlca.sqlerrtext //先读错误信息,然后立即ROLLBACK再提示,以免提示时用户不确定,表还在锁定中
    rollback; //立即回滚,以免其它用户等待.
    messagebox("提示","数据库发生以下错误:~n"+ls_err)
   return
end if
commit using sqlca;

2. sqlca.autocommit(参考)
在使用有增、删、改的语句时在前边加锁、更改完毕后解锁即可:
sqlca.autocommit=true
insert.......
update .......
delete......等语句
sqlca.autocommit=false

3. 用DataWindow操作的话:
1)Dw的Specify Update Characteristics属性:
设置DW的Specify Update Characteristics为: (3)Key and Modified Columns
这样,只要你更新的列的值没有变,则大家都可以成功,有效的防止了多用户重叠更新的问题,相当安全,不必使用第二选项.
2)数据窗口的RetrieveEnd事件
在数据窗口的Retrieveend事件的脚本中加COMMIT USING SQLCA;

呵呵,PB是有这个问题,以前给别个说的时候有些人还不信。你可以在数据窗口的RetrieveEnd事件里面加上一句“commit;”就OK了。个人认为是数据窗口在检索出数据后仍然占据着相应的表资源,直到提交数据为止才会释放,也就是结束本次事务,开始新的事务。PB这样做可能是为了保证数据的完整性,使用我说的解决办法,经测试没有发现什么问题,但是也不能保证完全没问题,有问题的话也是出在数据库的并发控制上,有兴趣自己去测试一下嘛。

4. SQLCA.LOCK属性(RC或RU)
设置sqlca.lock='RU',这样的缺陷是降低了读取数据的安全级别。
示例代码:
// 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

--******************************************************************************************************************************

http://www.myexception.cn/pb/1566235.html
PB11连接SQL2000,只有查询为何老把别的程序锁死
我用PB11开发了一个程序,程序全部都是查询的功能,没有任何Update,当然用了数据窗口。
为什么会把别的程序给锁死呢?(别的程序有Update)

我PB11中连接方式是:
SQLCA.DBMS = "OLE DB"
SQLCA.LogPass = "----"
SQLCA.LogId = "----"
SQLCA.AutoCommit = False
SQLCA.DBParm = "PROVIDER='SQLOLEDB',DATASOURCE='---',PROVIDERSTRING='database=E----'"

好奇怪,哪位高手给指点一下。
------解决方案--------------------
加上
sqlca.lock='RU' 
或者
sqlca.lock='RC'


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用MSS连接时的默认级别,适用于大多数情况,当然还要看你的具体应用了
 
 

--******************************************************************************************************************************

sql server 数据库引擎隔离级别
SQL-99 标准定义了下列隔离级别,Microsoft SQL Server Database Engine 支持所有这些隔离级别:
未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据)
已提交读(数据库引擎 的默认级别)
可重复读
可序列化(隔离事务的最高级别,事务之间完全隔离)
实际测试发现,当设置sqlca.lock='RR'可重复读时,会出现死锁,其他三种不会。似乎PB10以上版本缺省是sqlca.lock='RR'才会造成死锁。
一般是用“RC”,低版本的PB用MSS连接时的默认级别,适用于大多数情况,当然还要看你的具体应用了

--******************************************************************************************************************************

以上是网络资料,本人总结以上情况,如下:

1、select 大数据后,需要commit;

2、dw里Retrieveend,添加commit;

3、sqlca.lock = 'rc'

4 、数据库表要编个需要,dw里面select * a,b,表要按顺序写,

5、及时提交commit

6、sqlca.autucommit要处理好

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值