我必须向我的数据库中添加大量信息。添加此信息大约需要5-7分钟。并且我需要添加事务。
我试过这个:
try {
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
UpdateTable1();
UpdateBigTable2();
...
db.Transaction.Commit();
} catch {
db.Transaction.Rollback();
}但是当我的数据库在更新时,我不能读取我的数据库或对我的数据库做任何事情。
我试着设置IsolationLevel,但都没有用。
我试过这个:
using (var ts = new TransactionScope()) {
UpdateTable1();
ts.Complete();
}但是程序在2-3分钟后崩溃。
这个解决方案也没有帮助:
var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
...
}如果我设置了TransactionScopeOption.Suppress,当数据库正在更新时,我可以访问数据库,但在这种情况下,事务不起作用。
发布于 2012-10-05 16:21:57
是的,如果您启动了一个处理大量记录的事务,并且需要很长时间才能完成,那么直接的结果就是竞争操作将被阻塞。对于“可序列化”事务尤其如此,因为它们占用最多的锁(包括键范围锁等)。这是事务的本质;它是ACID中的i。
选项:
快照隔离不是在一个巨大的transaction
NOLOCK或READ UNCOMMITTED.
发布于 2012-10-05 16:23:30
using (var trans = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}
))
{
// Your LINQ to SQL query goes here where you read some data from DB
}更新表(插入、删除或更新)时,它们会被锁定,因此,如果您要读取尚未提交的数据,则可以使用Transaction IsolationLevel.ReadUncommitted来允许脏读取
发布于 2014-01-31 20:09:40
你试过这个吗?
transactionOptions.Timeout = TransactionManager.MaximumTimeout;https://stackoverflow.com/questions/12742241
复制相似问题