澳门新葡亰游戏网址澳门新葡亰游戏网址,澳门新葡亰游戏平台网站(www.496.net)是亚洲最热门的娱乐网址之一,澳门国际娱乐秉承“保证一流质量,保持一级信誉”的经营理念
当前位置:

数据库并发一致性案例分析(存取钱)

作者: 澳门新葡亰游戏网址|来源: http://www.xmshou.com|栏目:澳门新葡亰游戏网址|    日期:2019-08-10

文章关键词:

澳门新葡亰游戏网址,可存取性

  本部分内容为《数据库原理》课程中的一个课堂案例,幻灯片提供的动画演示有助于理解并发控制的本质,本文内容为幻灯片的摘要。

  如果你对自己并发控制的能力很有自信的话,读完“一、问题提出”后直接可以跳转到“四、看来问题真不简单”处阅读。

  现在要求编写一程序,完成两项功能:存款与取款。每次操作完成后向明细表中插入一行记录并更新帐户余额。

  当然,问题还不止这些!如何读取最后一行记录?你会发现随着明细记录的增加越来越没效率。

  该隔离级别与二级封锁协议相对应。读数据前加共享锁,读完就释放。前面分析过,此处不再赘述。

  RepeatableRead对应第三级封锁协议:读前加共享锁,事务完成才释放。

  但对于本案例执行效果与RepeatableRead一样(效率低下,成功率低,还有讨厌的死锁!)。

  经过重新设计后仍然无法让人满意的解决问题!连最高隔离级别都会在高度并发时因为死锁造成很大一部分事务执行失败!

  死锁的原因是因为读前加S锁,而写前要将S锁提升为X锁,由于S锁允许共享,导致X锁提升失败,产生死锁。

  如果在读时就加上X锁,就可避免上述问题(从封锁协议角度这似乎不可能,但确完全可行!)

  其实SQL Server允许在一条命令中同时完成读、写操作,这就为我们提供了入手点。

  因此甚至将事务隔离级别设置为ReadUnCommitted都能确保成功执行

  还有可优化的余地:网络带宽受到限制时,数据在网络上传输的时间往往比对数据进行读写操作的时间要长。

  由于在同一台机器上执行数据库与应用程序,实验结果表明存储过程的执行效率不如直接在应用程序中通过命令调用高。

  如果能在一个带宽受到限制的网络上将数据库与应用程序分离,然后测试,相信会有令人满意的结果。(有待具体实验证实)

  最近园子里面关于O/R Mapping讨论得很激烈,想问大家一个问题,就是对于上述问题,O/R Mapping是否提供了解决办法,允许在Mapping的同时更加精细的控制更新手段呢?

  2、SimpleUpdateInMultiThread(引入并发,10个线程同时工作,结果上面的更新策略出现了问题)

  3、RepeatableReadUpdate(本文第五部分中,使用RepealableRead事务隔离级别的并发更新,随没有错误,但导致了死锁)

  4、AnotherMethod(本文最后给出的更新方式,高效且没有死锁)

  5、UseStoredProcedure(使用存储过程完成更新)创建存储过程的代码可以从DataBase目录下找到。

  首先在SQL Server 2005中建立一空数据库DBApp,程序执行时会自动在此数据库中创建所需要的表以及记录。

  这段代码没有考虑任何并发问题,也没有使用事务,仅仅是读取最后一条记录的余额数据,然后根据余额和存取钱金额算出最新余额,并将数据插入到明细记录中。在没有并发问题时,该程序可以很好的执行。调用该段代码的主程序如下:

  在这段代码中引入了并发操作,通过10个线个人同时进行存取款操作,为了使得模拟真实有效,特意在两条SQL命令执行之间随机休息了一段时间,其它代码同上没有什么变化,结果会发现,帐户余额计算多处出现错误。

  该段代码引入了事务,并将事务隔离级别设置为RepeatableRead,程序经过漫长的执行后,你会发现尽管没有出现任何余额计算错误,但10个线程中仅有一半左右执行成功,其它线程执行失败,这是由于内部死锁问题造成的。感兴趣的话可以查看SQL Server中锁的状态。

  该段代码实现了在更新的同时完成读操作,避免了因锁的提升带来的并发问题。10个线程同时执行成功,并且执行时间与串行执行的时间几乎相同,真正意义上实现了可串行化。

  该段代码使用存储过程实现。存储过程如下,利用了SQL Server 2005中提供的Try...Catch结构配合事务也可以很好的完成上述任务。

文章标签: 澳门新葡亰游戏网址 ,可存取性

 上一篇:AT89S52是一个低电压高性能CMOS 8位单片机 片内含

 下一篇:没有了