ECO中的对象乐观锁定(Optimistic Locking)

多客户端ECO技术的对象操作乐观锁定(Optimistic Locking)
    ECO中的对象乐观锁定设置位于ECO类的design-time属性中,用于解决多个客户端同时进行修改而带来操作冲突,比如有个ECO类Person,里面有两个属性Firstname:string和Lastname:string,如果有两个客户端读取同一个Person记录后,其中一个客户端修改了此实例的Firstname并更新了数据库(Ecospace.UpdateDatabase),而另一个客户端对这个类的Firstname作了修改和数据库更新,于是就产生了该类实现在数据库中的值的覆盖和锁定的问题。

    ECO对于类的锁定作了下面的选择:
1. Off设定,相当于直接实现update Person set Firstname='newvalue' where BOLD_ID=8,另一个客户端的修改将被冲刷掉;

2. Default设定,则这个类的乐观锁定取决于它的父类的乐观锁设定;

3. ModifiedMembers,这个设定是先判断已修改的属性在数据库中是否已改变(如:select a.BOLD_ID, a.BOLD_TYPE, a.Firstname from Person a where a.BOLD_ID=8) 取回的值与第一次读取值不同的话则产生"Optimistic locking failed for 1 objects"的Borland.Eco.Internal.BoldSystem.EBoldOperationFailedForObjectList 的异常报告。

4. AllMembers设定,操作与ModifiedMembers相类似,只是在ECO内部查看已修改值的方式是查询并返回所有的属性值(select * ...)

5. Timestamp设定,启用这个值需要在ECOspace中把PersistenceMapper组件的SqlDatabaseConfig.UseTimestamp值修改为True,然后在Ecospace中点击右键,使用Evolve Database补充生成一个叫ECO_TIMESTAMP的数据表,这个表只有一个BOLD_TIME_STAMP整数字段,一旦我们修改Person类的值之后要写入数据库中,ECO会先执行: Update ECO_TIMESTAMP set BOLD_TIME_STAMP=BOLD_TIME_STAMP+1,然后返回这个stamp值,然后再执行对象的数据库更新Update Person set Firstname='newvalue' where bold_id=8 ,此时ECO会自动执行一个小事务,先判断当前数据库中的stamp值是否和刚才加1并取回的值相同(确认此间没有他人更新数据),则数据更新成功,否则返回Optimistic locking failed for 1 objects. 也是一个EBoldOperationFailedForObjectList的异常。使用Timestamp方式的ECO类单独使用一个stamp数据,不会和其它类的stamp识别冲突,我们可以把这个stamp值看成是数据更新事务的ID号。

    此类锁问题同样也出现在Java服务器上面,比如Jboss等对EJB的实现,看起来Borland的ECO对于此类问题还有很多需要完善的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值