我正在使用事务运行多个插入。我正在使用SqlDependency类让客户端机器知道服务器何时更新。
我遇到的问题是每当我使用事务插入时,无论我为事务设置了什么隔离级别,SqlNotificationEventArgs都会将e.Info作为Isolation返回,这表明我为该事务设置了错误的隔离级别(我认为)。当我在不使用交易的情况下插入时,一切都顺利进行。
我的问题是,使用Sql Notification时,事务支持的隔离级别(如果有)是什么?
以下是我用于通知的一些代码:
void DataChanged(object sender, SqlNotificationEventArgs e) {
var i = (ISynchronizeInvoke)_form;
if (i.InvokeRequired) {
var tempDelegate = new OnChangeEventHandler(DataChanged);
object[] args = { sender, e };
i.BeginInvoke(tempDelegate, args);
} else {
var dependency = (SqlDependency)sender;
if (e.Type == SqlNotificationType.Change) {
dependency.OnChange -= DataChanged;
GetData(dependency);
}
}
}
对于交易:
public void ExecuteNonQueryData(List<string> commandTexts) {
SqlConnection connection = null;
var command = new SqlCommand();
SqlTransaction transaction = null;
try {
connection = new SqlConnection(GetConnectionString());
connection.Open();
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
foreach (var commandText in commandTexts) {
try {
command.Connection = connection;
command.CommandText = commandText;
command.Transaction = transaction;
command.ExecuteNonQuery();
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}
transaction.Commit();
} catch (Exception ex) {
Console.WriteLine(ex.Message);
} finally {
command.Dispose();
if (transaction != null) transaction.Dispose();
if (connection != null) {
connection.Close();
connection.Dispose();
}
}
commandTexts.Clear();
}
编辑:我在错误的地方提交交易。
答案 0 :(得分:2)
显然,查询通知不支持交易。删除事务代码解决了这个问题。
根据微软的说法:
Transact-SQL不提供订阅通知的方法。 SQL Server中托管的CLR数据访问类不支持查询通知。
此引文位于http://msdn.microsoft.com/en-us/library/ms188669.aspx,其中描述了查询通知的工作原理及其要求。