S60平台:使用DBMS APIs —共享数据库

6、共享数据库
Symbian 系统的DBMS提供了一个服务器设备用以帮助多客户同时获取同样的数据库内容。事务架构可以保证同一时间仅有一个客户可能改变数据。
API 有两个关键概念:DBMS服务器会话和数据库变更提示。
共享数据库仅通过RDbNameDatabase可实现。


6.1 DBMS 服务器会话
DBMS的会话允许相应的数据库可由多客户的读写访问实现共享。会话可以被用于打开任意数目的数据库。若一个客户提出写请求,数据库中的所有用户都必须使用DBMS服务器。
RDbs提供DBMS服务器会话服务。


6.2 数据库更新提示
客户可以通过RDbNotifier来通告数据库更新(这些事务可以通过执行回滚,数据库关闭以及恢复操作完成)用于实现共享。


6.3 事务与锁
通过使用RDbDatabase抽象基类,可以实现事务支持。一个事务状态可以通过Begin()来引发;否则所有的内部更新都有一个自动事务实现。特别地,一个事务可由Commit()或Rollback()来终止。这些操作或永久更新现存数据状态或恢复先前状态。如果一个事务用Begin()开启,一个查询以及一个事务状态是否存在通过调用返回TBool类型的InTransaction()即可完成。
对任意不同时包含DML操作或DDL操作的事务中,相关事务架构都有一个规范。为了组织单一事务包含两种数据操作,当底层表的定义被修改时,所有受影响的游标都无效。在这种情况下,一个游标会产生KErrDisconnected错误,只能被关闭。一旦DDL语句完成,行集可以重新生成。在该类游标上调用Reset()无效。当改变架构时,行不会被更新。
 在客户之间,事务架构不提供隔离功能。在一个事务内,一旦一个客户对表进行更新其他的客户也会看到更新。对两次读操作期间发生的数据改变没有自动机制进行保护。这可能会导致“不一致矛盾”。当一个客户通过一个事务封装独立的读操作时,其可以阻止数据的更新。由于读锁被使用,这个事务不能修改数据库;抽象基类RDbDatabase的成员函数Commit()或Rollback()释放该种锁并且不会影响数据库。
在共享数据库上调用Begin()可以获得一个共享读锁;如果其他用户已在执行写锁,该操作将会失败。若其他用户对该语句使用读锁,则不会对这次操作造成影响。
任何修改数据库的操作都尝试获得一个高级写锁,当其他客户在共享数据库中有任何类型锁时,该操作失败。如果当前用户已经有一个Begin()返回的读锁,这种情况下,读锁会转化为高级写锁。
在一个读锁后调用Commit()或Rollback()将释放客户端的锁。仅当所有客户端的这类锁都被移出时,数据库是无锁状态的。数据库将通过一个RDbNotifier::EUnlock数据库时间来报告任何对数据库的修改。
 在一个写锁后调用Commit()或Rollback()需要客户端所有锁已被释放,在这种情况下,其将通过RDbNotifier::ECommit或一个RDbNotifer::ERollback事件来获得数据库变更的信息。
 如果更新不是直接对事务进行操作,系统将会使用自动事务。如果不能得到高级锁,这些更形将会失败。
当面对不一致读时,共享读锁保证了更多的实时性。然而,这种方法允许死锁出现。如果两个客户端同时试图更新数据库并且在他们开始更新前使用Begin()开启一个事务,一个客户端的读锁将会阻止其他用户使用写锁,反之亦然。在客户段进行编码将排除这类死锁情况,这种情况下,试图通过重试操作来释放这些锁是不可能的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值