我需要向数据库中的所有40个用户表添加一个删除标志列.我可以编写一个脚本来循环遍历sys.tables,但我想我会检查一下是否有人有更好的解决方案,或者预先为这个场景创建了sql.
发现OleDBConnection似乎不是ThreadSafe.它似乎尝试打开多个连接.
//doesn't work
using (OleDbConnection oConn = TheDataAccessLayer.GetConnection())
using (OleDbTransaction oTran = oConn.BeginTransaction())
Parallel.ForEach(ORMObjects, (ORMObject, State) =>
{
if (!State.ShouldExitCurrentIteration && !State.IsExceptional)
{
var Error = ORMObject.SomethingThatExecutesANonQuery(oConn,oTran)
if (Error.Number != 0)
State.Stop();
}
});
Run Code Online (Sandbox Code Playgroud)
如果我锁定了ExecuteNonQuery的连接,那么错误就会消失,但性能却会消失.
//works
using (OleDbConnection oConn = TheDataAccessLayer.GetConnection())
using (OleDbTransaction oTran = oConn.BeginTransaction())
Parallel.ForEach(ORMObjects, (ORMObject, State) =>
{
if (!State.ShouldExitCurrentIteration && !State.IsExceptional)
{
lock(oConn)
{
var Error = ORMObject.SomethingThatExecutesANonQuery(oConn,oTran)
if (Error.Number != 0)
State.Stop();
}
}
});
Run Code Online (Sandbox Code Playgroud)
假使,假设
我无法改变ORM的本质:SQL不能被批量化
业务规则要求在单个事务中执行交互
所以:
是否有更好/更有效的方法来并行化OleDb交互?
如果没有,OleDb客户端是否有可以充分利用并行性的替代方案?(也许是原生的MSSQL客户端?)