选择显示字体大小

也谈sqlserver的锁

 通常我们在进行数据库的新增、修改、删除、查询的时候如果我们面对的不是多个用户也及时单机处理的时候,
一般我们基本上不需要考虑数据库的表锁定以及死锁之类情况,但是如果我们面对的是多用户的并行处理的
网络环境的时候我们对表锁定的问题就需要较为仔细的分析和考虑,否则他给我们带来的麻烦就不言而喻了,
下面就把我的在这件事情上遇到的问题以及解决办法同大家一起分享。
也是在我的开发过程当中有这样的事情:
两个用户同时保存新增的数据,我们的程序开始是这样处理
    cn.begintrans
    cn.execute "insert into tablea ....."
    set rs = cn.execute("select count(*) from tablea where ...")
    if rs.recordcount > 0 then
        '表a 的字段a不能从复
        cn.rollbacktrans
    else
        cn.committrans
    end if

当sql server 在执行insert 命令时如果我们不添加任何参数时 数据库默认申请一个 ix 锁 给表a
这时候我们来分析上面的程序,当第一个用户执行    cn.execute "insert into tablea ....." connection
数据库申请了一个 ix 锁 给表a ,与此同时当第二个用户执行    cn.execute "insert into tablea ....." connection 也向数据库也成功地申请了一个 ix 锁 给表a ,但是当执行  
set rs = cn.execute("select count(*) from tablea where ...")
这一句的时候就会有问题产生,我们假设第一个用户先一步执行 ,由于select命令需要向数据库申请一个
s 锁给表a,但是由于这时候表a已经存在一个ix锁并且属于另外一个连接因此他只好在此等候。紧接着第二个
用户也执行
set rs = cn.execute("select count(*) from tablea where ...")
他也会向数据库申请一个s 锁给表a ,这时候数据就会自动结束较晚申请ix锁的连接同时回滚这个事务
这样子对于我们的应用来说就是一个很大的失败。

解决的办法一,设置数据参数让我们可以读取没有提交的数据、

    cn.begintrans
    cn.execute "set transaction isolation level read uncommitted "
    cn.execute "insert into tablea ....."
    set rs = cn.execute("select count(*) from tablea where ...")
    if rs.recordcount > 0 then
        '表a 的字段a不能从复
        cn.rollbacktrans
    else
        cn.committrans
    end if
    cn.execute "set transaction isolation level read committed "

解决的办法二,设置insert 命令 参数 with (tablock) 、

    cn.begintrans
    cn.execute "insert into tablea with (tablock)  ....."
    set rs = cn.execute("select count(*) from tablea where ...")
    if rs.recordcount > 0 then
        '表a 的字段a不能从复
        cn.rollbacktrans
    else
        cn.committrans
    end if
 
解决的办法三,增加一个没有用lock 表、

    cn.begintrans
    cn.execute "update tmplocktable set fieldlock=1"
    cn.execute "insert into tablea with (tablock)  ....."
    set rs = cn.execute("select count(*) from tablea where ...")
    if rs.recordcount > 0 then
        '表a 的字段a不能从复
        cn.rollbacktrans
    else
        cn.committrans
    end if


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons