Не уверен, что DB4O предоставляет что-то подобное из коробки, но может сам реализовать какую-то пессимистическую блокировку, при которой тот же объект либо не будет возвращен, либо будет возвращен в режиме только для чтения. Вам нужно будет вести список редактируемых объектов и проверять этот список каждый раз, когда вы возвращаете свои объекты. Но есть и такие проблемы, как уход пользователей и застревание объектов в «режиме редактирования» и т. Д. Обычно для этого требуется какой-то сервис, включающий механизм тайм-аута. Это может быть сложно.
Или сделайте это с оптимизмом, например пусть оба пользователя редактируют его, но сохраняют изменения только от первого пользователя, и предупреждают второго пользователя при попытке сохранить его. Обычно делается с отметкой времени.
Редактировать
Чтобы привести конкретный пример, этот код C # предоставляет базовый способ «заблокировать» объект, чтобы он не возвращался каждый раз. В реальной жизни все будет сложнее.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ListTest
{
class Program
{
static void Main(string[] args)
{
DataAccess dataAccess = new DataAccess();
// get objects from database
List<MyThing> things = dataAccess.GetThings();
MyThing thingToWorkOn = things[things.Count-1];
printThingList(things);
// lock the object to work on
dataAccess.LockThing(thingToWorkOn);
// someone else gets the list - doesn't include thing being edited
List<MyThing> moreThings = dataAccess.GetThings();
printThingList(moreThings);
// edit the object
thingToWorkOn.Name = "Harrold";
thingToWorkOn.Name = "Harry";
// save the object and unlock it
dataAccess.Save(thingToWorkOn);
dataAccess.UnlockThing(thingToWorkOn);
// now when someone else gets the list, includes all objects
List<MyThing> evenMoreThings = dataAccess.GetThings();
printThingList(evenMoreThings);
}
static void printThingList(List<MyThing> things)
{
Console.WriteLine("* Things *");
things.ForEach(x => Console.WriteLine(x.Name));
Console.WriteLine();
}
}
// The objects you're working with. Could just use 'object' or some interface.
class MyThing : IEquatable<MyThing>
{
public string Name { get; set; }
public bool Equals(MyThing other)
{
return other.Name == this.Name;
}
}
// Class to get objects from database.
class DataAccess
{
// simple list to store 'locked' objects
private static List<MyThing> lockedThings = new List<MyThing>();
// Get all objects except the locked ones
public List<MyThing> GetThings()
{
List<MyThing> thingsFromDatabase = LoadThingsFromDatabase();
var nonLockedThings = (from thing in thingsFromDatabase
where !lockedThings.Contains(thing)
select thing
).ToList<MyThing>();
return nonLockedThings;
}
// lock an object so it can't be seen by anyone else
public void LockThing(MyThing thingToLock)
{
lockedThings.Add(thingToLock);
}
// unlock an object
public void UnlockThing(MyThing thingToLock)
{
lockedThings.Remove(thingToLock);
}
public void Save(MyThing thing)
{
// save to database
}
// dummy method to give us some objects
private List<MyThing> LoadThingsFromDatabase()
{
return new List<MyThing>() {
new MyThing(){ Name="Tom" },
new MyThing(){ Name="Dick" },
new MyThing(){ Name="Harry" }
};
}
}
}