【并发操作】多用户并发操作的解决方案
来源:互联网 发布:windows 抓包工具 编辑:程序博客网 时间:2024/05/17 21:07
【问题】在以前的系统开发中,经常遇到一个同样问题,就是多个用户同时并发操作一条记录,这次在交易系统开发过程中,又出现了这样问题。比如交易商A提交单子,由审核人员B审核,此时A正在修改单位,B也正在查看这条记录,A先修改保存后B再审核保存,导致B审核通过的记录不是他所看到的。
【分析】仔细考虑问题,大概分析了三个方法, 并确定了一个可行的方案,可能还有不完善的地方,但解决现有问题还是绰绰有余的。
最先想的是在交易业务代码中用lock对修改方法加锁,运行时注入单例,并且对方法加同步锁,保证了业务数据的正确性, 但是效率低下,用户在使用中不方便,背离了系统可以并发操作的原则。
然后考虑使用悲观锁,这次运行时注入原型,并发操作效率提高, 但是,在同步处理数据库表时又造成锁表,这样并发效率依旧很低。
最后考虑乐观锁, 只是一种数据版本校验机制,它不做数据库层次上的锁定,需要在要并发操作的主表中加入一个"VERSION"字段或者“LASTUPDATETIME”,如果研究过oracle的SCN应该有异曲同工之妙,它的原理是这样:运行时注入原型,这时数据表并不锁住,只是每次update或insert时将VERSION更新, 当下次update,insert时,会校验VERSION,如果不一致,此时提示信息已经修改过了,并且在事务控制下rollback,这样,保证了数据的正确性,并且也不影响并发操作的效率。但是出现的问题是:如果A读了数据,未来及更新,B先更新了数据, 那么他将提交不上数据,因为VERSION已经失效,这样就造成了A重新读取数据,重新填写单据信息。 这也是乐观锁一个缺点,可以在更新前临时保存A填写的数据,再在跳转页中加载这些数据,保证了交易商不用麻烦再次输入这些数据,更新成功则清空这些临时数据
【结果】
乐观锁在并发操作问题上,保证了业务效率和数据的正确性,基本可以采用这种方案解决交易中并发问题。
●悲观锁:指在应用程序中显式地为数据资源加锁。悲观锁假定当前事务操
纵数据资源时,肯定还会有其他事务同时访问该数据资源,为了避免当前
事务的操作受到干扰,先锁定资源。尽管悲观锁能够防止丢失更新和不可
重复读这类并发问题,但是它会影响并发性能,因此应该很谨慎地使用悲
观锁。
●乐观锁:乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问
该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用
程序采用版本控制手段来避免可能出现的并发问题。
- 【并发操作】多用户并发操作的解决方案
- 【并发操作】多用户并发操作的解决方案
- 【并发操作】多用户并发操作的解决方案
- 多用户并发操作的解决方案
- 多用户操作一个数据表时的并发性操作
- 多用户或并发数据库访问或操作的问题
- 多用户并发操作一条记录的锁定机制
- static类型引发多用户操作并发
- 数据库的并发操作
- LR 中的 Controller中多用户并发操作是怎样进行的(转)
- 数据库并发操作带来的问题以及解决方案
- lr学习笔记--controller进行并发操作,多用户单循环、多用户多循环
- 数据库并发操作丢失更新解决方案
- 并发操作的一致性问题
- 避免页面操作的并发
- 并发操作的文件名问题
- 多用户并发访问导致的错误
- java模拟并发操作
- Linux dump命令详解
- Oracle批量删除表脚本
- 电话公司和保安公司之间的吵架——老百姓眼中的360与QQ之争
- 两千块钱带来的 "希望"
- swing实现树表
- 【并发操作】多用户并发操作的解决方案
- Javascript基础知识
- cold desert cheap wow gold breeze blowing
- SQL Server 2005执行计划和实际计划命令
- 《c++ primer》第三章标准库类型学习笔记整理_2010/11/06
- 键盘输入
- 通过select模型实现具有超时设定的connect
- Ruby Benchmark 模块提供了测量和报告Ruby代码运行使用时间的方法。
- 变参函数的实现实例