web应用中并发控制的实现

web应用中并发控制的实现

ID:25551966

大小:56.50 KB

页数:6页

时间:2018-11-21

web应用中并发控制的实现_第1页
web应用中并发控制的实现_第2页
web应用中并发控制的实现_第3页
web应用中并发控制的实现_第4页
web应用中并发控制的实现_第5页
资源描述:

《web应用中并发控制的实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Web应用中并发控制的实现摘要:yAccount{  privateintversion;  ....  publicvoidsetVersion(intversion){    this.version=version;  }  publicintgetVersion(){    returnversion;  }  ....}而在映像文件中,我们使用optimistic-lock属性设定version控制,属性栏之后增加一个标签,例如:  设定好版本控制之后,在上例中如果B客户试图更新数据,将会引

2、发StableObjectStateException例外,我们可以捕捉这个例外,在处理中重新读取数据库中的数据,同时将B客户目前的数据与数据库中的数据读出来,让B客户有机会比对不一致的数据,以决定要变更的部份,或者您可以设计程式自动读取新的资料,并重复扣款业务流程,直到数据可以更新为止,这一切可以在后台执行,而不用让您的客户知道。在其它架构中也可通过这种思路来实现乐观锁,但版本控制和冲突的检测要在自己程序的程序中实现和维护。2.悲观锁(PessimisticLocking)虽然乐观锁能够提高系统的性

3、能,但它是对发生冲突的访问进行事后的补救,应用在用户输入数据量很少的场合比较适合,但如果在企业ERP,用户与系统交互涉及大量数据在页面表单上录入,如果事后提交失败后才提示用户要重新录入是很不现实的,所以有必要进行事前控制,这就要采用悲观锁。在多个客户端可能读取同一笔数据或同时更新一笔数据的情况下,防止同一个数据被修改而造成混乱,最简单的手段就是在读取时对数据进行锁定,其它客户端不能对同一笔数据进行更新的读取动作。悲观锁定(PessimisticLocking)一如其名称所示,悲观的认定每次资料存取时,

4、其它的客户端也会存取同一笔数据,因此对该笔数据进行事先锁定,直到自己操作完成后解除锁定。悲观锁定通常透过系统或数据库本身的功能来实现,依赖系统或数据库本身提供的锁定机制,Hibernate即是如此,我们可以利用Query或Criteria的setLockMode()方法来设定要锁定的表或列(ro.LockMode.READ:在读取记录时Hibernate会自动获得锁定。LockMode.NONE:没有锁定。也可以在使用Session的load()或是lock()时指定锁定模式以进行锁定。如果数据库不支

5、持所指定的锁定模式,Hibernate会选择一个合适的锁定替换,而不是丢出一个例外。3.其它构架中悲观锁的实现.L.编辑。Hibernate的悲观锁,也是基于数据库的锁机制实现。下面的代码实现了对“用户”查询记录的加锁:StringsqlStr="fromuserInfoasuserin’";Queryquery=session.createQuery(sqlStr);query.setLockMode("user",LockMode.UPGRADE);//加锁ListuserList=query.l

6、ist();//执行查询,获取数据query.setLockMode对查询语句中,特定别名所对应的记录进行加锁(我们为userInfo类指定了一个别名“user”),这里也就是对返回的所有user记录进行加锁selecttuser0_.idasid,tuser0_.userIdasuserId,tuser0_.group_idasgroup_id,tuser0_.user_typeasuser_type,tuser0_.sexassexfromt_usertuser0_in’)forupdate通过上

7、述转换后的sql语句可知,Hibernate的加锁其实是利用了数据库的forupdate语句,在读取阶段对某条记录的锁定,而在更新阶段提交,释放锁。其实其它架构也可以采取该思路,不过,数据库的forupdate语句的锁定和释放一定要在数据的同一个连接中,如果读取阶段和更新阶段不是统一连接,即读取之后断开了与数据库的连接,则forupdate语句的锁定立即失效,为此,如果其它架构中要采取这种方式则要做相应的调整。首先,由于ap数据结构中;在更新时,通过该serialId在连接池中重新获取该连接,用该连接

8、去更新数据。如果系统是采用dao读取数据,实体bean去更新数据,则只要在更新数据之前断开读取数据时的连接,则可以通过其它途径更新数据,如下代码所示:publicvoidupdate(AbstractEntityDatadata,String[]selTeamName,StringserialId)thro.

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

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

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