您的位置:首页 > 其它

db4o Tutorial 中文翻译(十)

2007-05-06 19:05 246 查看

8. 事务

你有没有这样的疑问:db4o如何在一个单独的数据表中处理并发访问?像其他数据库管理系统一样,db4o具有一种事务的机制。在考虑多线程甚至远程,数据库被并行访问之前,首先要了解db4o的事务概念。

8.1. 执行和会滚

也许你没有注意到,我们从第一章就开始用事务了。按照定义,你已经用过了db4o的事务了。当一个数据库链接打开的时候,事务已经隐性开始了;当数据库关闭的时候,事务已经执行了。下面的代码从功能上和我们之前写的一样,只是使用了事务。

// storeCarCommit
Pilot pilot = new Pilot("Rubens Barrichello", 99);
Car car = new Car("BMW");
car.Pilot = pilot;
db.Set(car);
db.Commit();

// listAllCars
IObjectSet result = db.Get(typeof(Car));
ListResult(result);

当然,可以会滚事务,以回到以前的状态:

// storeCarRollback
Pilot pilot = new Pilot("Michael Schumacher", 100);
Car car = new Car("Ferrari");
car.Pilot = pilot;
db.Set(car);
db.Rollback();

// listAllCars
IObjectSet result = db.Get(typeof(Car));
ListResult(result);

8.2. 刷新活动的对象

还有一个问题:当数据库的数据会滚的时候,内存中的对象已经被修改了。如何刷新内存中的对象呢?

// carSnapshotRollback
IObjectSet result = db.Get(new Car("BMW"));
Car car = (Car)result.Next();
car.Snapshot();
db.Set(car);
db.Rollback();
Console.WriteLine(car);

当你意识到要会滚的时候,可以手动更新。

// carSnapshotRollbackRefresh
IObjectSet result=db.Get(new Car("BMW"));
Car car=(Car)result.Next();
car.Snapshot();
db.Set(car);
db.Rollback();
db.Ext().Refresh(car, int.MaxValue);
Console.WriteLine(car);

What is this IExtObjectContainer construct good for? Well, it provides some functionality that is in itself stable, but the API may still be subject to change. As soon as we are confident that no more changes will occur, ext functionality will be transferred to the common IObjectContainer API.
IExtObjectContainer 有什么好处呢?它提供了一些内部固定的功能,但是API还是变了。当我们确定没有更多的变化时,ext功能将变成普通的IObjectContainer API。

最后,我们可以再次清除:

// deleteAll
IObjectSet result = db.Get(typeof(Object));
foreach (object item in result)
锘縰sing System;
using System.IO;
using Db4objects.Db4o;
namespace Db4objects.Db4o.Tutorial.F1.Chapter5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: