SQL Server Id列似乎在C#app

时间:2018-05-07 15:22:59

标签: c# sql-server windows-server-2012-r2

我的公益组织使用的数据库的Web应用程序突然停止运行。基本上我无法保存任何新条目。我可以编辑条目,但每当我创建新条目时,我都会收到错误。

我的组织使用的应用是自定义C#app。我正在挖掘日志,并将问题隔离到跟踪用户会话的表中。

  

NHibernate.Exceptions.GenericADOException:无法执行批处理命令。[SQL:SQL不可用] ---> System.Data.SqlClient.SqlException:违反PRIMARY KEY约束' PK__tUserSes__3214EC07F91B0D0B'。无法在对象' SiteUser.tUserSession'中插入重复的密钥。重复键值为(7062)。

该表有超过300000个条目,ID显然是错误的,它不是它应该是的ID。我在日志中返回的越多,Id编号越低。就像在某些Id柜台休息一样。

每当我尝试添加新条目时,我得到"请求处理期间发生系统错误。请联系系统管理员。"在日志中看起来像无法在对象' SiteUser.tUserSession'中插入重复键。重复键值为(7062)。

我将日志跟踪到第一次出现错误的位置。它实际上是20180507.log日的日志文件的开头

  

2018-05-07 00:24:29,990 WARN NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException(0x80131904):超时已过期。操作完成之前经过的超时时间或服务器没有响应。

     

System.ComponentModel.Win32Exception(0x80004005):等待操作超时

     

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection,Action`1 wrapCloseInAction)
  在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)
  在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)
  在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
  at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte [] buffer,TransactionManagerRequestType request,String transactionName,TransactionManagerIsolationLevel isoLevel,Int32 timeout,SqlInternalTransaction transaction,TdsParserStateObject stateObj,Boolean isDelegateControlRequest)
  在System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,String transactionName,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean isDelegateControlRequest)
  在System.Data.SqlClient.SqlInternalTransaction.Commit()
  在System.Data.SqlClient.SqlTransaction.Commit()
  在NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session,IIsolatedWork work,Boolean transacted)

     

ClientConnectionId:c6788280-f7cc-4c3a-9bf2-514f4df84fc9
  错误号:-2,状态:0,类:11
  2018-05-07 00:24:30,006错误NHibernate.Util.ADOExceptionReporter - 超时已过期。操作完成之前经过的超时时间或服务器没有响应   2018-05-07 00:24:30,006 WARN NHibernate.Util.ADOExceptionReporter - System.ComponentModel.Win32Exception(0x80004005):等待操作超时
  2018-05-07 00:24:30,006错误NHibernate.Util.ADOExceptionReporter - 等待操作超时
  2018-05-07 00:24:30,006错误NHibernate.Base.Transaction.With - 交易失败。
  NHibernate.Exceptions.GenericADOException:执行隔离工作时出错[SQL:SQL不可用] ---> System.Data.SqlClient.SqlException:超时已过期。操作完成之前经过的超时时间或服务器没有响应。 ---> System.ComponentModel.Win32Exception:等待操作超时
  ---内部异常堆栈跟踪结束---
  在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action 1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalTransaction.Commit()
at System.Data.SqlClient.SqlTransaction.Commit()
at NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted)
--- End of inner exception stack trace ---
at NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted) at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted) at NHibernate.Engine.TransactionHelper.DoWorkInNewTransaction(ISessionImplementor session) at NHibernate.Id.MultipleHiLoPerTableGenerator.Generate(ISessionImplementor session, Object obj) at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj) at Quiddita.Business.Statistics.Services.StatisticsBusinessService.<>c__DisplayClass1.<CreateNewUserSession>b__0() in d:\Projects\CAT – Site Database\Source\Quiddita.Business.Statistics\Services\StatisticsBusinessService.cs:line 71 at NHibernate.Base.Transaction.With.Transaction(IsolationLevel level, Action transactional) in d:\Projects\CAT – Site Database\Source\NHibernate.Base\Transaction\With.Transaction.cs:line 39 2018-05-07 00:24:30,037 ERROR Quiddita.Aspects.Statistics.MethodBoundaryAspects.NewSessionAspectAttribute - NewSessionAspectAttribute.OnSuccess failed to execute. NHibernate.Exceptions.GenericADOException: error performing isolated work[SQL: SQL not available] ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception: The wait operation timed out --- End of inner exception stack trace --- at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)          在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)          在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&amp; dataReady)          在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)          at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte [] buffer,TransactionManagerRequestType request,String transactionName,TransactionManagerIsolationLevel isoLevel,Int32 timeout,SqlInternalTransaction transaction,TdsParserStateObject stateObj,Boolean isDelegateControlRequest)          在System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,String transactionName,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean isDelegateControlRequest)          在System.Data.SqlClient.SqlInternalTransaction.Commit()          在System.Data.SqlClient.SqlTransaction.Commit()          在NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session,IIsolatedWork work,Boolean transacted)          ---内部异常堆栈跟踪结束---          在NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session,IIsolatedWork work,Boolean transacted)          at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session,IIsolatedWork work,Boolean transacted)          在NHibernate.Engine.TransactionHelper.DoWorkInNewTransaction(ISessionImplementor会话)          在NHibernate.Id.MultipleHiLoPerTableGenerator.Generate(ISessionImplementor session,Object obj)          at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity,String entityName,Object anything,IEventSource source,Boolean requiresImmediateIdAccess)          在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件)          在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent事件)          在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent事件)          在NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent事件)          在NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj)          在Quiddita.Business.Statistics.Services.StatisticsBusinessService。&lt;&gt; c__DisplayClass1.b__0()在d:\ Projects \ CAT中 - 站点数据库\源\ Quiddita.Business.Statistics \ Services \ StatisticsBusinessService.cs:第71行          在d:\ Projects \ CAT中的NHibernate.Base.Transaction.With.Transaction(IsolationLevel级别,Action transactional) - Site Database \ Source \ NHibernate.Base \ Transaction \ With.Transaction.cs:第54行          at Quiddita.Business.Statistics.Services.StatisticsBusinessService.CreateNewUserSession(Nullable 1 userId, String IPAddress) in d:\Projects\CAT – Site Database\Source\Quiddita.Business.Statistics\Services\StatisticsBusinessService.cs:line 74 at Quiddita.Aspects.Statistics.MethodBoundaryAspects.NewSessionAspectAttribute.OnSuccess(MethodExecutionArgs args) in d:\Projects\CAT – Site Database\Source\Quiddita.Aspects.Statistics\MethodBoundaryAspects\NewSessionAspectAttribute.cs:line 68 2018-05-07 00:24:31,056 WARN NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException (0x80131904): Violation of PRIMARY KEY constraint 'PK__tUserSes__3214EC07F91B0D0B'. Cannot insert duplicate key in object 'SiteUser.tUserSession'. The duplicate key value is (1). The statement has been terminated. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)          在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)          在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&amp; dataReady)          在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)          在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async,Int32 timeout,Task&amp; task,Boolean asyncWrite,SqlDataReader ds)          at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,TaskCompletionSource 1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite)          在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()          在System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery()          在NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)       ClientConnectionId:a7af4119-1d67-4f69-ae91-fc556c97768f       错误号码:2627,州:1,班级:14       2018-05-07 00:24:31,068错误NHibernate.Util.ADOExceptionReporter - 违反PRIMARY KEY约束&#39; PK__tUserSes__3214EC07F91B0D0B&#39;。无法在对象&#39; SiteUser.tUserSession&#39;中插入重复的密钥。重复键值为(1)。       该语句已终止。       2018-05-07 00:24:31,068错误NHibernate.Event.Default.AbstractFlushingEventListener - 无法将数据库状态与会话同步       NHibernate.Exceptions.GenericADOException:无法执行批处理命令。[SQL:SQL不可用] ---&gt; System.Data.SqlClient.SqlException:违反PRIMARY KEY约束&#39; PK__tUserSes__3214EC07F91B0D0B&#39;。无法在对象&#39; SiteUser.tUserSession&#39;中插入重复的密钥。重复键值为(1)。       该语句已终止。          at System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource 1完成,Int32超时,Task&amp; task,Boolean asyncWrite)          在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1完成,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite)          在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()          在System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery()          在NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)          ---内部异常堆栈跟踪结束---          在NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)          在NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps)          在NHibernate.AdoNet.AbstractBatcher.ExecuteBatch()          在NHibernate.Engine.ActionQueue.ExecuteActions()          在NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会话)       2018-05-07 00:24:31,068错误NHibernate.Base.Transaction.With - 交易失败。

这是StatisticsBusinessService.cs的一部分:第74行

/// <summary>
/// Creates new <c>UserSession</c> and saves the object to database.
/// </summary>
/// <param name="userId">The database id of the<see cref="User"/> associated with the Session. If <c>null</c> then the anonymous user is in question.</param>
/// <param name="IPAddress">The IPAddress of the client machine the page was accessed from.</param>
/// <returns>The newly created <c>UserSession</c> object.</returns>
public UserSession CreateNewUserSession(long? userId, string IPAddress)
{
    UserSession userSession = null;
    With.Transaction(() =>
    {
        userSession = InitializeUserSession();
        if (userId.HasValue)
            userSession.User = _securityService.LoadUser(userId.Value, null);
        userSession.IPAddress = IPAddress;
        UnitOfWork.CurrentSession.SaveOrUpdate(userSession);
    });
    return userSession;
}

我发现在出现问题之前的几个小时内,我们得到了一堆暴力密码猜测。其中每个都记录在会话表中。登录不断发布但我们实施了防火墙,只允许一组IP登录。所以我认为我们还没有遭到破坏。

在此问题出现之前,Windows服务器几周内无法访问。文件尚未更改,数据库尚未更改。窗户尚未更新。基本上没有任何系统改变,但id计数器以某种方式重置。我检查了数据库,id列没有设置为identity(false),所以我猜自动增量已经在应用程序中实现,而不是在数据库级别实现。

我对C#,SQL Server和整个Windows生态系统有0次经验。我完全失去了正在发生的事情。

我们使用Windows Server 2012r2,SQL Server 2014 Express,IIS 8

任何线索都将非常感激。

1 个答案:

答案 0 :(得分:0)

堆栈跟踪!

如果我已正确理解您的自动编号种子刚刚重置。 做一个备份,试试这个:

SELECT MAX(tUserSession) FROM SiteUser

你会得到一个号码,比方说123456 然后用相同的值重新设置自动编号:

DBCC CHECKIDENT (SiteUser, RESEED, 123456)