Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法提交当前事务,并且无法支持写入日志文件的操作。回滚事务_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 无法提交当前事务,并且无法支持写入日志文件的操作。回滚事务

Sql 无法提交当前事务,并且无法支持写入日志文件的操作。回滚事务,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我知道还有其他问题的确切标题与我发布的问题相同,但每一个问题都非常特定于他们所引用的查询或过程 我在这里为一所大学管理一个黑板学习系统,可以直接访问数据库。简言之,有一个存储过程会导致系统问题。有时,当对系统的更改被提交到后端的日志中时,无法提交被称为bbgs_cc_setStmtStatus的存储过程,也无法支持写入日志文件的操作。回滚事务 这是SP的代码,但是,我没有编写它,因为它是Blackboard在为应用程序填充和创建表时安装的设备的一部分 USE [BBLEARN] GO /****

我知道还有其他问题的确切标题与我发布的问题相同,但每一个问题都非常特定于他们所引用的查询或过程

我在这里为一所大学管理一个黑板学习系统,可以直接访问数据库。简言之,有一个存储过程会导致系统问题。有时,当对系统的更改被提交到后端的日志中时,无法提交被称为bbgs_cc_setStmtStatus的存储过程,也无法支持写入日志文件的操作。回滚事务

这是SP的代码,但是,我没有编写它,因为它是Blackboard在为应用程序填充和创建表时安装的设备的一部分

USE [BBLEARN]
GO
/****** Object:  StoredProcedure [dbo].[bbgs_cc_setStmtStatus]    Script Date: 09/27/2013 09:19:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE              [dbo].[bbgs_cc_setStmtStatus](
   @registryKey   nvarchar(255),
   @registryVal   nvarchar(255),
   @registryDesc  varchar(255),
   @overwrite     BIT
) 
AS
BEGIN
  DECLARE @message varchar(200);

  IF (0 < (SELECT count(*) FROM bbgs_cc_stmt_status WHERE registry_key = @registryKey) ) BEGIN
    IF( @overwrite=1 ) BEGIN
      UPDATE bbgs_cc_stmt_status SET
        registry_value = @registryVal,
        description    = @registryDesc,
        dtmodified     = getDate()
      WHERE registry_key = @registryKey;
    END
  END
  ELSE BEGIN
    INSERT INTO bbgs_cc_stmt_status
        (registry_key, registry_value, description) VALUES
        (@registryKey, @registryVal, @registryDesc);
  END

  SET @message = 'bbgs_cc_setStmtStatus: Saved registry key [' + @registryKey + '] as status [' + @registryVal + '].';
  EXEC dbo.bbgs_cc_log @message, 'INFORMATIONAL';

END
我不希望得到特定于黑板的支持,但我想知道,对于SQLServer2008来说,是否有什么可以检查的,看看是否有系统设置导致了这种情况。我确实有一张用黑板打开的票,但还没有听到任何声音

以下是我检查过的一些东西:

tempdb系统数据库:

我让templog的初始大小为100MB,并让它自动增长100MB,不受限制地查看这是否是问题的根源。这似乎没有帮助。我们实际的tempdb从4GB开始,每次需要时自动增长1 gig。tempdb中可用空间为tempdb实际大小的95-985是否正常?例如,现在tempdb的大小为12388.00 MB,可用空间为12286.37 MB


此外,主BBLEARN表的日志文件已停止增长,因为它已达到其最大自动grwoth。我将其初始大小设置为3GB以增加其大小。

也许您可以使用MERGE语句:


我认为这样会更有效率。

我看到一些可能会阻止提交的潜在错误,但在不了解更多结构的情况下,这些只是猜测:

嵌套if中的update子句尝试更新必须唯一的列或列集。因为该检查仅验证至少存在一项,但不限制该检查以确保仅存在一项

IF (0 < (SELECT ...) ) BEGIN
您可以将非唯一值插入到必须唯一的行中。检查以确保在运行更新的属性上没有约束,特别是查找主键、标识和唯一约束。很可能这就是问题所在:低但非零

应用程序没有将值传递给所有参数,导致@message字符串为null,从而导致日志记录方法在尝试添加null字符串时出错。请记住,在SQL anything+null=null中,虽然可以插入值并将其更新为null,但不能以提供的代码的方式记录null。相反,要考虑空值,您应该将消息变量的setter更改为以下内容:

SET @message = 'bbgs_cc_setStmtStatus: Saved registry key [' + COALESCE(@registryKey, '') + '] as status [' + COALESCE(@registryVal,'') + '].';
根据报告的错误,这很可能是您的问题,但同样,如果没有可能阻止传递空参数的应用程序代码,则无法知道

另外,我要指出的是

IF (0 < (SELECT count(*) ...) ) BEGIN
因为它更有效。您不必返回子查询的每一行,因为执行计划将首先运行FROM语句并查看行是否存在,而不必实际计算select,计算这些行,然后将其与0进行比较

从这些建议开始,如果您能提供更多信息,我可以帮助您解决更多问题

启动SSMS 导航到数据库名称 右键单击数据库名称并选择属性>选项 将延迟耐久性更改为允许 单击“确定”
该错误可由bbgs_cc_日志存储过程生成。你能出示bbgs\U cc\U日志吗?这是个糟糕的建议。如果有人想这么做,请联系我。。。我会尽力说服你离开窗台
IF (0 < (SELECT count(*) ...) ) BEGIN
IF (EXISTS (SELECT 1 ...) ) BEGIN