gpt4 book ai didi

多线程环境中的 PetaPoco 事务

转载 作者:行者123 更新时间:2023-12-04 15:02:01 37 4
gpt4 key购买 nike

我只是以多线程方式测试 PetaPoco 事务...

我有一个简单的测试用例:

-- 简单的值对象称之为 MediaDevice
-- 插入一条记录,更新1000次

void TransactionThread(Object object)
{


Database db = (Database) object;

for(int i= 0; i < 1000;i++)
{


Transaction transaction = db.GetTransaction();

MediaDevice device = new MediaDevice();
device.Name = "Name";
device.Brand = "Brand";

db.Insert(device);

device.Name = "Name_Updated";
device.Brand = "Brand_Updated";


db.Update(device);

transaction.Complete();

}


long count = db.ExecuteScalar<long>("SELECT Count(*) FROM MediaDevices");

Console.WriteLine("Number of all records:" + count);

}

我在两个线程中这样调用它:[两个线程的单个数据库对象]
void TransactionTest()
{

Database db = GetDatabase();

Thread tThread1 = ... // thread for TransactionTest()

Thread tThread2 = ... // thread for TransactionTest()

tThread1.Start(db); // pass Database to TransactionTest()
tThread2.Start(db); // pass same Database to TransactionTest()

}

我收到 Null 错误或有时数据库的对象处理错误..

但是当我提供两个数据库实例时,
void TransactionTest()
{

Database db = GetDatabase();
Database db2 = GetDatabase();

Thread tThread1 = ... // thread for TransactionTest()

Thread tThread2 = ... // thread for TransactionTest()


tThread1.Start(db); // pass Database instance db to TransactionTest()
tThread2.Start(db2); // pass Database intance db2 to TransactionTest()

}

一切正常...

好吧,当我在交易中检查 PetaPoco 源代码时,我在交易中看到了。Complete
 public virtual void Complete()
{
_db.CompleteTransaction();
_db = null;
}

我的问题是能够使用来自多个线程的事务我是否必须使用数据库对象的新副本?或者我做错了什么?

为了使其线程安全,我是否必须在每次数据更新查询时打开和关闭新数据库?

最佳答案

是的,您每个线程都需要一个单独的 PetaPoco 数据库实例。请参阅 PetaPoco 文档中的引用:

Note: for transactions to work, all operations need to use the same instance of the PetaPoco database object. So you'll probably want to use a per-http request, or per-thread IOC container to serve up a shared instance of this object. Personally StructureMap is my favourite for this.



我将提供线索的短语加粗。据说每个线程应该使用 PetaPoco 数据库对象的一个​​实例。

关于多线程环境中的 PetaPoco 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11191926/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com