Topic: 关于并发性操作的讨论 |
Print this page |
1.关于并发性操作的讨论 | Copy to clipboard |
Posted by: gunrose Posted on: 2003-03-20 11:35 首先说明,我不知道我这个贴该放在哪儿.但是我考虑到一般情况下,并发性操作都是针对企业级的系统开发,所以放在这儿了. 如果版主认为我放错地方,移走就是,千万别扣分(我刚才看到一贴说放错地方要扣分的).如果扣了,我会不会变-1?那样的话,离1分就更远了. 平常我们在做程序时,为了考虑并发性操作的问题,都是在对象和数据库中放置一个timeStamp字段,在用户操作前,先和其它数据字段一起取出,放到model或者view层中(例如web app),当用户操作时,必须要保证对象的timeStamp和数据库中的一致,才可以操作,否则rollback. 在web app中,我们当前的系统使用的是struts+EJB.本来数据可以放到http 的session中来缓存,但是我们考虑到当用户量大时session中的数据会占用服务器的大量内存.因此只允许把数据放到request中,用完就丢.如果需要跨页面传输,就在jsp中hidden.那么对象中的所有信息需要hidden到jsp中,包括timeStamp. 现在地问题是,大家有没有更好的方法来处理这种web app的并发操作? 或者在做其它类型的app中,有更好的并发操作的处理方式? 有相关书籍或者文章吗? BTW,在做企业级的app开发当中,有哪些是必须考虑到的问题?例如并发操作,安全,权限,性能,还有哪些呢? |
2.Re:关于并发性操作的讨论 [Re: gunrose] | Copy to clipboard |
Posted by: rainman Posted on: 2003-03-24 02:39 应该可以用数据库锁来控制啊。 |
3.Re:关于并发性操作的讨论 [Re: rainman] | Copy to clipboard |
Posted by: gunrose Posted on: 2003-03-24 12:52 由于是基于web的系统,要考虑以下问题: 问题是在什么时候锁?性能会否降低? 如果用户中途退出会否有问题? 如果用户连续两次提交相同的信息会如何? 能否详细介绍一下数据锁的方案?谢谢! |
4.Re:关于并发性操作的讨论 [Re: gunrose] | Copy to clipboard |
Posted by: rainman Posted on: 2003-03-24 13:11 比如下订单。 两个人同时要购买同一件商品,而商品数量只有1个。 这时候你就要加锁了。 1.lock 商品库存表,设置auto commit =false; 2.query 出还有一个商品,交易继续; 3.将库存减1 4.将商品加到用户的order里 5.commit交易,unlock商品库存表 如果不上锁,第3步的时候可能会得出负数来。 如果第4步出错了,那么可以取消交易,本来减1为0的库存又变成1了,这样再等lock的第二个用户可以在获得锁以后继续处理。 如果用EJB来实现,也可以将提交订单的方法标记为同步(需要满足分布式)。如果是简单的load balance的web 应用那么用数据库锁来就是最保险的了。 我想这不会有什么效率问题,因为提交的次数不会比浏览次数多,否则如果真的很多的话,说明你就赚了很多钱,那再买一台服务器好了。 因为启动了事务处理,所以用户中途退出也不用担心啊。 连续提交两次表单这是另外一个问题了。 我也看到过好几种处理办法,一种是在数据库(DB2上),还有一种在客户端上用随机数来标记,还有一种就是交易完一次就把服务器端的数据标记一下,这样第二次的时候状态就不对了,throw IllegalStateException.. |
5.Re:关于并发性操作的讨论 [Re: rainman] | Copy to clipboard |
Posted by: gunrose Posted on: 2003-03-25 13:21 我同意你的处理方式,实际上就是transaction的问题。谢谢你的答复。 可能我没有表达清楚。我实际上关心的是你最后面回答的那一部分: 【我也看到过好几种处理办法,一种是在数据库(DB2上),还有一种在客户端上用随机数来标记,还有一种就是交易完一次就把服务器端的数据标记一下,这样第二次的时候状态就不对了,throw IllegalStateException.. 】 对于这些不同的处理方式,有什么更具体的描述,或者评比。 有没有相关的书籍或例子可以参考? 我目前的处理方法是在数据库加timeStamp类型的字段:lastModifiedDate.当要更新数据库时(update或者delete),先开始transaction,find ejb,如果ejb的lastModifiedDate和用户得到的lastModifiedDate不一致,就rollback,并抛出DataModifiedException(自定义的)。否则,commit |
6.Re:关于并发性操作的讨论 [Re: gunrose] | Copy to clipboard |
Posted by: rainman Posted on: 2003-03-25 13:24 这是一个common issue,放眼internet,到处都是资料啊。 http://www.google.com/search?hl=zh-CN&ie=UTF-8&oe=UTF-8&q=double+submit&lr= http://www.google.com/search?q=%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%E8%A1%A8%E5%8D%95&ie=UTF-8&oe=UTF-8&hl=zh-CN&lr= |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |