实际业务中碰到了PB开发的业务系统造成的数据死锁情况,整理了一些PB关于数据库死锁的一些处理。

PB死锁相关

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

PowerBuilder预防数据库死锁相关处理的更多相关文章

  1. atitit 提升数据库死锁处理总结

    atitit 提升数据库死锁处理总结 正常的来说,锁上都是自动的..不用官.. 正常来讲,insert时不需要加rowlock,就默认是rowlock了, #-----锁的自动转换原理.(正常的不用理 ...

  2. Mysql 死锁相关操作

    该随笔随时记录日常工作中遇到的关于mysql的死锁相关问题 1)查看mysql当前的处理线程(connection) mysql> show processlist; 2)杀掉对应的connec ...

  3. SQL Server 收集数据库死锁信息

    背景 我们在数据库出现阻塞及时邮件预警提醒中监控了数据库的阻塞情况,为了更好的维护数据库,特别是提升终端客户用户体验,我们要尽量避免在数据库中出现死锁的情况.我们知道收集死锁可以开启跟踪标志如1204 ...

  4. MySQL数据库死锁分析

    背景说明: 公司内部一套自建分布式交易服务平台,在POC稳定性压力测试的时候出现了数据库死锁.(InnoDB引擎)由于保密性,假设是app_test表死锁了. 现象: 发生异常:Deadlock fo ...

  5. Mybatis-update - 数据库死锁 - 获取数据库连接池等待

    最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: update失败,原因是数据库死锁 select等待,原因是connection连接池被用光了,需要等 ...

  6. 查询Sqlserver数据库死锁的一个存储过程

    From:http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会 ...

  7. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  8. SqlServer定时备份数据库和定时杀死数据库死锁解决

    上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定 ...

  9. 查询Sqlserver数据库死锁的一个存储过程(转)

    链接 :http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会产 ...

随机推荐

  1. Java学习-练习1

    题目描述: 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到, 而这对数字各包含乘积的一半位数的数字,其中最初的数字中可以 选取的数字可以任意排序,以两个0结尾的数字是不允许的,例如,下 面的 ...

  2. HDOJ1166 敌兵布阵

    赤裸裸的线段树,借个模板,改写一下即可. 代码: #include<iostream> #include<cstdio> #include<stdio.h> #in ...

  3. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  4. C# 中4个访问符和8个修饰符详解

    4个访问修饰符(是添加到类.结构或成员声明的关键字) Public:公有的,是类型和类型成员的访问修饰符.对其访问没有限制. Internal:内部的,是类型和类型成员的访问修饰符.同一个程序集中的所 ...

  5. v​s​快​捷​键

    Ctrl+E,D ----格式化全部代码 Ctrl+A+K+FCtrl+E,F ----格式化选中的代码 Ctrl+K+FCTRL + SHIFT + B生成解决方案 Alt+B+B 或 F6 生成当 ...

  6. 将类数组对象(array-like object)转化为数组对象(Array object)

    用法:Array.prototype.slice.call(array-like object) // 创建一个类数组对象 var alo = {0:"a", 1:"b& ...

  7. html系列教程--DOCTYPE a area

    <!DOCTYPE>标签:<!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令.在 HTML 4.01 中,& ...

  8. 使用logstash收集日志的可靠性验证

    实时计算里,需要对日志实时收集,logstash可以做到.目前的版本是1.4.2,官方文档在http://www.logstash.net/docs/1.4.2/,里面有详细的配置说明,使用也很简单. ...

  9. How to close existing connections to a DB

    use master ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE --do you stuff here A ...

  10. 通过url给action传中文参数乱码解决方案

    比如: http://localhost:8080/projectName/dutyCondition.action?admitstate=0&currentStep=我的博客 传到后台的时候 ...