数据库原理补充:数据库并发控制软件设计案例

数据库原理补充:数据库并发控制软件设计案例

ID:40220221

大小:648.00 KB

页数:24页

时间:2019-07-26

数据库原理补充:数据库并发控制软件设计案例_第1页
数据库原理补充:数据库并发控制软件设计案例_第2页
数据库原理补充:数据库并发控制软件设计案例_第3页
数据库原理补充:数据库并发控制软件设计案例_第4页
数据库原理补充:数据库并发控制软件设计案例_第5页
资源描述:

《数据库原理补充:数据库并发控制软件设计案例》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、并发控制案例分析主讲:吕震宇说明实验环境:VisualStudio.NET2005SQLServer2005其它说明:SQLServer2000+VS.NET2003也可以需要对代码做细微调整源代码及数据库见附件并发控制案例设某银行存款帐户数据如下表:现在要求编写一程序,完成两项功能:存款与取款。每次操作完成后向明细表中插入一行记录并更新帐户余额。帐号0001户名张三序号金额帐户余额1¥1,000.00¥1,000.002¥-500.00¥500.003¥200.00¥700.004¥400.00¥1,100.005¥-700.00¥400.001、问题似乎很简单解决办法:

2、①读取最后一行记录的帐户余额数据②根据存、取款金额计算出新的帐户余额③将新的记录插入表中真的这么简单?在不考虑并发问题的情况下是可行的如果考虑并发,问题就多了序号金额帐户余额………………5-700.00400.00到银行取钱单位发工资①银行读取帐户 余额400元②单位读取帐户 余额400元③单位发工资2000元 更新帐户余额62000.002400.00④取款100元 更新帐户余额7-100.00300.00余额错误上述解决办法的并发问题2、让我来想一想问题所在:并发问题!解决办法:加锁!在读最后一条记录时先加上锁。怎么加锁?加什么锁?读之前加共享锁?读之前加排它锁?读之前

3、加共享锁?显然不行!序号金额帐户余额………………5-700.00400.00到银行取钱单位发工资①银行读取帐户 余额400元②单位读取帐户 余额400元③单位发工资2000元 更新帐户余额62000.002400.00④取款100元 更新帐户余额7-100.00300.00余额错误ss读之前加排它锁,事务完成再释放?三级封锁协议中没有定义读前加排它锁(暂且不管)显然不行!序号金额帐户余额………………5-700.00400.00到银行取钱单位发工资①银行读取帐户 余额400元④单位读取帐户 余额400元⑤单位发工资2000元 更新帐户余额72000.002400.00③取款1

4、00元 更新帐户余额6-100.00300.00余额错误xx②等待…等待…等待…x还不止这些如何读取帐户余额?SELECTTOP1帐户余额FROM帐户明细ORDERBY序号DESC存在的问题:在并发场景下你怎么确定它一定是最后一行?随着数据量增大越来越没效率(因为需要排序)3、看来问题真的不是这么简单问题出在哪里呢?从系统设计一开始我们就走错了!重新设计!帐号户名帐户余额帐号序号金额帐户余额0001张三¥400.0000011¥1,000.00¥1,000.0000012¥-500.00¥500.0000013¥200.00¥700.0000014¥400.00¥1,100

5、.0000015¥-700.00¥400.00AccountAccountDetail冗余数据为什么引入冗余数据?确保帐户余额在唯一的地方进行存储避免了读取帐户余额时访问大量数据并排序新问题:我们无法直接对数据库进行锁操作必须通过合理的事务隔离级别完成并发控制ReadUnCommittedReadCommittedRepeatableReadSerializable4、着急吃不着热豆腐看来我们必须对各事务隔离级别逐一分析①ReadUnCommitted显然不行在这个事务隔离级别下连脏数据都可能读到,何况“脏”帐户余额数据。②ReadCommitted也不行该隔离级别与二级封

6、锁协议相对应。读数据前加共享锁,读完就释放。前面分析过,此处不再赘述。③RepeatableRead这个隔离级别比较迷惑人,需要仔细分析:RepeatableRead对应第三级封锁协议:读前加共享锁,事务完成才释放。例:假设事务1执行存钱操作,首先对帐户余额加S锁,然后修改数据。此时事务2要想改帐户余额,它必须先加X锁(自然加不上),所以无法完成操作。这似乎避免了并发问题的发生,在一个事务执行时将另一个事务的修改请求暂时阻塞,直到事务完成。但真的能满足应用程序的需要吗?序号金额帐户余额………………5-700.00400.00到银行取钱单位发工资①银行读取帐户 余额400元②

7、单位读取帐户 余额400元④单位发工资2000元 更新帐户余额XLock等待…等待…等待…等待…等待…等待…③取款100元 更新帐户余额XLock等待…等待…等待…等待…等待…等待…等待…等待…等待…尚未提交的脏数据x帐号户名帐户余额0001张三¥400.00ss6-100.00300.00x72000.002400.00可见RepeatableRead事务隔离级别容易造成死锁。一旦出现死锁,DMBS不得不牺牲一个进程。牺牲进程换来的是不会出现并发异常。④Serializable该事务隔离级别在执行时可以避免幻影读

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。