我不是SQL专家,每当我需要做一些超出基础知识的事情时,我就会想起这个事实.我有一个不大的测试数据库,但事务日志肯定是.如何清除事务日志?
我已经在这一天工作了大约一天半,并在网上搜索了大量的博客和帮助文章.我发现了几个与此错误有关的SO问题,但我认为它们并不适用于我的情况(或者在某些情况下,遗憾的是,我无法理解它们的实现:P).我不确定我能够很好地描述这一点以获得帮助......但是这里有:
我们有一个.NET应用程序来跟踪我们的资源.有一个导出功能可以将资源复制到时间跟踪系统和计费系统; 这将访问链接到时间和计费数据库的存储过程.
我最近将计费系统数据库移动到新服务器(原始服务器:Server 2003 SP2,SQL 2005;新服务器:Server 2008 R2,SQL 2008 R2).我有一个指向2008数据库的链接服务器设置.我更新了存储过程以指向2008服务器,然后我收到有关MSDTC和RPC的错误(http://www.safnet.com/writing/tech/archives/2007/06/server_myserver.html).我在链接服务器上启用了"rpc/rpc out"并将MSDTC设置为允许网络访问(类似于:http://www.sqlwebpedia.com/content/msdtc-troubleshooting).
现在,当我尝试运行导出功能时,我得到了上述内容:"此SqlTransaction已完成;它已不再可用." 对我来说似乎很奇怪的是,当我刚刚运行存储过程(来自SSMS)时,它表示它已成功完成.
谁看过这个吗?我在配置中遗漏了什么吗?我继续浏览相同的页面,我发现的唯一一件事是我在进行MSDTC更改后没有重新启动(在此处提到:http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/7172223f-acbe-4472-8cdf-feec80fd2e64 /).
我可以发布部分或全部存储过程,如果它有帮助...请告诉我.
我有以下代码执行单行提交到数据库表(SQL 2008/.NET 4)
using (var db = new MyDbDataContext(_dbConnectionString))
{
Action action = new Action();
db.Actions.InsertOnSubmit(dbAction);
db.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
通常一切都很好,但有一段时间我得到以下异常:
System.InvalidOperationException: This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Rollback()
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
Run Code Online (Sandbox Code Playgroud)
关于SO有很多类似的问题,但在阅读之后我无法解决问题.
这可能只是由于SQL超时(在调用后接近25秒发生异常)?或者我应该期望在这种情况下SQL超时异常?
有谁知道还有什么可能导致这个?
我在申请中遇到了一次错误.
这个SQLTransaction已经完成; 它不再可用
堆栈跟踪附在下面 - 它说Zombie Check和Rollback.
代码中的错误是什么?
注意:此错误只出现一次.
UPDATE
从MSDN - SqlTransaction.Rollback方法
如果连接终止或者事务已在服务器上回滚,则Rollback会生成InvalidOperationException.
我在各种应用程序中看到此错误的最常见原因之一是,在我们的应用程序中共享 SqlConnection.
码
public int SaveUserLogOnInfo(int empID)
{
int? sessionID = null;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlTransaction transaction = null;
try
{
transaction = connection.BeginTransaction();
sessionID = GetSessionIDForAssociate(connection, empID, transaction);
//Other Code
//Commit
transaction.Commit();
}
catch
{
//Rollback
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
transaction = null;
}
//Throw exception
throw; …Run Code Online (Sandbox Code Playgroud)