我正在使用引用的linkedserver与存储过程作斗争。链接服务器可通过端口转发通过互联网访问 - 因此没有VPN,LAN。
服务器双方 MS SQL SERVER 2008 EE v.10.0.5512
配置链接服务器,DTC:
无法插入图片:(
enable promotion of distributed transaction = false
RPC = false
RPC out = false
Network DTC Access checked
Allow inbound true
Allow outbound true
No authentication Required
存储过程看起来像
CREATE PROCEDURE [dbo].[spSynchronizeArticles]
-- Add the parameters for the stored procedure here
(
@pDebug bit,
@siteId bigint
)
AS
BEGIN
SELECT *
FROM [LinkedServer].[MyDatabase].dbo.Storages
WHERE Storage.siteId = @siteId
RETURN 0
END
你在这里看不到任何交易。如果我是正确的,MS DTC每次调用链接服务器时都会创建事务。
我从c#这样调用这个程序
SqlCommand sqlCmd = new SqlCommand("spSynchronizeArticles");
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue("@pDebug", false);
sqlCmd.Parameters.AddWithValue("@siteId", siteId);
SqlParameter returnValue = new SqlParameter("returnVal", SqlDbType.Int);
returnValue.Direction = ParameterDirection.ReturnValue;
sqlCmd.Parameters.Add(returnValue);
using (SqlConnection conn = new SqlConnection(Context.LocalData.ConnectionString))
{
try
{
try
{
conn.Open();
sqlCmd.Connection = conn;
sqlCmd.ExecuteScalar();
return Convert.ToInt32(returnValue.Value);
}
catch (Exception ex)
{
//log exception to file
return -1;
}
}
finally
{
conn.Close();
}
}
}
在同步数据时,无限调用此c#代码。在同一个线程中,还有另一种方法,即从文件中获取数据(如果存在)并将它们保存到本地数据库。
SynchronizeArticles方法更频繁地调用并且一切正常,但是一旦调用了从文件获取数据的方法,SynchronizeArticles总是抛出此异常
System.Data.SqlClient.SqlException(0x80131904):服务器上的MSDTC “LocalServer \ SQLEXPRESS2008”不可用。
该方法使用Transaction,看起来像
public void FillDataFromViewWithTrans(DataTable dt, string wherePhrase)
{
dt.Rows.Clear();
SqlCommand sql = new SqlCommand(String.Format(@"SELECT *
FROM SomeView
{0}", String.IsNullOrEmpty(wherePhrase) ? String.Empty : "WHERE " + wherePhrase));
using (SqlConnection conn = new SqlConnection(Context.LocalData.ConnectionString))
{
SqlTransaction trans = null;
try
{
try
{
conn.Open();
trans = conn.BeginTransaction(IsolationLevel.RepeatableRead);
sql.Transaction = trans;
sql.Connection = conn;
SqlDataAdapter dA = new SqlDataAdapter(sql);
dA.Fill(dt);
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
//log exception to file
return;
}
}
finally
{
conn.Close();
}
}
}
这只是插图样本:)
告诉我我错过了什么。
此外,我遇到了各种错误的MS DTC的麻烦
由于OLE DB提供程序无法执行此操作 'SQLOLEDB'无法开始分布式事务。
警告:致命错误8510发生在2013年4月10日上午9:07。请注意 错误和时间,并与您的系统管理员联系。
唯一有用的是重启Windows服务或UI应用程序。从 MS SQL管理工作室,程序始终可以正常工作。没有问题。
现在我必须说我很绝望,我错过了什么?
修改
int i = 0;
while (true)
{
i++;
if ((i % 9) == 0)
{
//local select with transaction Works all the time
CallLocalSelectWithTransaction();
}
// CallProcedure works 8 times, after first calling of CallLocalSelectWithTransaction
// the callProcedure works no more.
CallProcedure(); // procedure with linked server
}