Sql server 同一事务范围内的RavenDB和MsSql会导致WebException
为了回答关于stackoverflow的另一个问题,我创建了一个测试用例,在这个测试用例中,我隔离了用于存储和读取的事务。在我的测试用例中,我正在同一事务中调用raven文档存储和mssql数据库。但我有一个网络例外。你知道为什么或者如何解决它吗。 下面是我的代码Sql server 同一事务范围内的RavenDB和MsSql会导致WebException,sql-server,ravendb,transactionscope,system.net.webexception,Sql Server,Ravendb,Transactionscope,System.net.webexception,为了回答关于stackoverflow的另一个问题,我创建了一个测试用例,在这个测试用例中,我隔离了用于存储和读取的事务。在我的测试用例中,我正在同一事务中调用raven文档存储和mssql数据库。但我有一个网络例外。你知道为什么或者如何解决它吗。 下面是我的代码 private static string con = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestDB;Data Sou
private static string con = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestDB;Data Source=.";
static void Main(string[] args)
{
using (var scope = new TransactionScope())
{
additemtosql();
}
Console.WriteLine((itemSqlCount() == 0));
using (var mDocumentStore = new DocumentStore())
{
mDocumentStore.ParseConnectionString("Url=http://localhost:8081");
mDocumentStore.Initialize();
using (var scope = new TransactionScope())
{
additemtoravendb(mDocumentStore);
Console.WriteLine((itemSqlCount() == 0));
scope.Complete();
}
Console.WriteLine(itemRavenCount(mDocumentStore) == 1);
}
}
private static void additemtoravendb(IDocumentStore mDocumentStore)
{
using (var session = mDocumentStore.OpenSession())
{
var dog = new Dog()
{
Age = 10,
BirthDay = DateTime.Now,
Breed = "Dalmation",
Name = "Fluffy"
};
session.Store(dog);
session.SaveChanges();
}
}
private static int itemRavenCount(IDocumentStore mDocumentStore)
{
using (var session = mDocumentStore.OpenSession())
{
var dogs = session.Query<Dog>().ToList();
return dogs.Count();
}
}
private static void additemtosql()
{
var sql = "INSERT INTO RECORDS_TEXT VALUES (1, 'XX', 'XX') ";
using (var connection = new SqlConnection(con))
using (var command = new SqlCommand(sql, connection))
{
connection.Open();
command.ExecuteNonQuery();
Console.WriteLine((itemSqlCount() == 1));
}
}
private static int itemSqlCount()
{
using (var connection = new SqlConnection(con))
using (var command = new SqlCommand("", connection))
{
connection.Open();
command.CommandText = "SELECT COUNT(*) FROM RECORDS_TEXT";
using (var reader = command.ExecuteReader())
{
reader.Read();
var count = reader.GetInt32(0);
return count;
}
}
}
我很清楚,我从一个事务范围开始,然后我没有完成它,这是我正在测试的。如果我是对的,不完成交易应该回滚。我想测试一个失败的事务,然后测试一个成功的事务
我之所以在同一事务中调用ravendb和mssql,是因为我在模拟嵌套事务可能发生的情况,其中一个调用可能是sql,另一个调用是raven,甚至不知道进行了另一个调用。下面是错误的堆栈跟踪:在c:\Builds\RavenDB Stable\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs中的System.Net.HttpWebRequest.GetResponse在Raven.Client.Connection.HttpJsonRequest.ReadResponseBytes中:第188行Txid中的Raven.Client.Connection.ServerClient.DirectPromoteTransactionGuid,c:\Builds\RavenDB Stable\Raven.Client.Lightweight\Connection\ServerClient.cs中的字符串操作URL:Raven.Client.Connection.ServerClient.c_u中的第1180行显示c:\Builds\RavenDBLook中的Class7b.b_u7a,在Fiddler中按实际请求加载。它会告诉你错误是什么。但我认为这已经在最新版本中得到了修复。是的,更新RavenDB起到了作用,并且成功了。谢谢你的回答。