标签: sqltransaction

捕获事务连接后的SqlTransaction为空

我有一个循环,我在其中调用具有不同参数值的存储过程。下一次调用cmd.ExecuteNonQuery(); 我使用事务来保存全部或回滚,并使用 checkBox2 - 始终保存。我发现了一个问题,但找不到解决方案。在触发 catch 块的第一个问题之后,事务对象失去连接。 t.connection一片空白!一切都很好,但事务对象在开始时没有连接

    try 
        {

        while (!sr.EndOfStream)
        {
            strLine.Remove(0, strLine.Length);
            //c = sr.ReadLine();

             while (c != "-")
              {
               c = sr.ReadLine();
               strLine.Append(c );
               if (sr.EndOfStream) break;
              }

             //strLine.Append("Nowa pozycja");
             try
             {
                 cmd.Parameters["@s"].Value = strLine.ToString();
                 cmd.Parameters["@Return_value"].Value = null;
                 cmd.ExecuteNonQuery();
             }
             catch
             {
                 if (cmd.Parameters["@Return_value"].Value == null)
                 {
                     cmd.Parameters["@Return_value"].Value = -100;
                 }

                 if (((int)cmd.Parameters["@Return_value"].Value == 100) || (checkBox2.Checked))
                 {
                     if ((int)cmd.Parameters["@Return_value"].Value != 100)
                     {
                         MessageBox.Show("S? b?edy!   " + cmd.Parameters["@s"].Value);
                     };
                 }
             } …
Run Code Online (Sandbox Code Playgroud)

c# connection transactions try-catch sqltransaction

6
推荐指数
1
解决办法
3378
查看次数

Npgsql 如何处理失败的事务?

在 ASP.NET 应用程序 (C#) 中,我们使用 Postgres 作为后端,使用 Npgsql 作为数据提供者。几天前,我们遇到了数据丢失的严重问题。我在代码中进行了调查,发现了这样的代码:

    var transaction = connection.BeginTransaction();
    //some crud operation here  
    transaction.Commit()
Run Code Online (Sandbox Code Playgroud)

有人坚持认为 Npgsql 会自行处理异常,并会在事务过程中出现问题时自动回滚事务。

在我看来,这是非常乐观的,代码应该包含在 try 和 catch 块中并显式调用事务回滚:

 var transaction = connection.BeginTransaction();
 try
    {
        //some crud operation here        
        transaction.Commit
    }catch(Exception ex)
    {
        transaction.Rollback();
    }
Run Code Online (Sandbox Code Playgroud)

错了吗?

此外,事务回滚总是有效吗?我在某处读到它只有在引发 Postgres 异常时才有效,比如在格式错误的 sql 的情况下,但在其他类型的异常的情况下它不起作用。有人也可以澄清这一点吗?

c# postgresql npgsql sqltransaction

6
推荐指数
2
解决办法
1775
查看次数

5
推荐指数
1
解决办法
3819
查看次数

5
推荐指数
1
解决办法
749
查看次数

SqlTransaction支持多个SqlConnections

所以我有多个SqlConnections我想要在一个中使用SqlTransaction.我知道我只能使用一个连接,但最终在每个连接中都有大量新声明和无用(在连接完成后)变量,并且我需要程序尽可能快地保持.

我在using声明中有每个Connection .

我使用的是最新的.NET和SQL Server 2008 R2.

可能吗?

另外,我已经看过了:

如何在.NET中为多个SqlConnections使用单个SqlTransaction?

没有人回答这个问题,平台已经过时了.

c# sql sqltransaction

5
推荐指数
1
解决办法
1万
查看次数

单个SqlConnection具有Transaction,多个命令的情况

我试图只使用一个连接并一起运行两个命令,一个使用事务,一个不使用.

没有跟踪/日志记录功能,因为此解决方案部署在另一个位置.因此,当流程部分失败时,我至少可以按照日志进行操作.

我将在这里添加我的测试代码:

SqlConnection connection = GetConnection();
SqlTransaction transaction = null;

try
{
    connection.Open();
    transaction = connection.BeginTransaction();

    SqlCommand logCommand = new SqlCommand("Log before main command", connection);
    logCommand.ExecuteNonQuery();

    string sql = "SELECT 1";
    SqlCommand command = new SqlCommand(sql, connection, transaction);
    int rows = command.ExecuteNonQuery();

    logCommand = new SqlCommand("Log after main command", connection);
    logCommand.ExecuteNonQuery();

    // Other similar code

    transaction.Commit();
    command.Dispose();
}
catch { /* Rollback etc */ }
finally { /* etc */ }
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务.该命令的Transaction属性尚未初始化.

如果没有其他无交易连接,有没有办法实现我想要做的事情?

或者,如果有一个更好的建议,以不同的方式通过单个连接优化我的代码,我就可以开始学习它.

c# sqlcommand sqlconnection sqltransaction

5
推荐指数
1
解决办法
4240
查看次数

提交交易需要太长时间?

我有一个存储过程具有以下代码:

BEGIN TRY
--BEGIN TRANSACTION @TranName

    DECLARE @ID int

    INSERT INTO [dbo].[a] ([Comment],[Type_Id],[CreatedBy])
    VALUES ('test',1,2)

    SET @ID = SCOPE_IDENTITY()

    INSERT INTO [dbo].[b] ([Can_ID],[Com_ID],[Cal_ID],[CreatedBy])
    VALUES (1,@ID,null,2)

    UPDATE c SET LastUpdated = GETDATE(), LastUpdatedBy = 2 WHERE b.id = @ID

    --COMMIT TRANSACTION @TranName

    SELECT * from [View] where a.id=@ID
    END TRY
    BEGIN CATCH
--ROLLBACK TRANSACTION @TranName
END CATCH
Run Code Online (Sandbox Code Playgroud)

单独运行的每个语句(现在都是)运行得很快.但是,当我们从Transaction的代码段中删除注释时,脚本运行时间从1秒增加到超过2分钟.

系统已经运行了很长一段时间了,之前这不是问题,我一直在尝试搜索有关SQL Server如何处理事务的文档,以防万一有可能影响SQL性能的事情而且这是唯一的事情.我想到的是事务日志......但理想情况下,这些单独的语句也可以在单个事务中运行,任何想法?

sql-server stored-procedures sqlperformance sqltransaction sql-server-2012

5
推荐指数
1
解决办法
2679
查看次数

如何使用 AWS RDS DataService (Aurora Serverless) 跨多个 SELECT 实现一致读取

我不确定如何在多个SELECT查询中实现一致的读取。

我需要运行多个SELECT查询并确保它们之间没有UPDATEDELETE或者CREATE已经改变了整体一致性。对我来说最好的情况当然是非阻塞的东西。

我将 MySQL 5.6 与 InnoDB 和默认REPEATABLE READ隔离级别一起使用。

问题是当我将 RDS DataServicebeginTransaction与多个executeStatement(使用提供的transactionId)一起使用时。调用commitTransaction.

commitTransaction只为我提供了一个{ transactionStatus: 'Transaction Committed' }..

我不明白,提交事务函数不是应该给我整个(我的许多SELECT)数据集结果吗?

相反,即使有transactionId,每个人 executeStatement都会返回我个人的结果......这种行为显然不一致..

amazon-web-services sqltransaction mysql-5.6 aws-aurora-serverless aws-rds-data-service

5
推荐指数
1
解决办法
647
查看次数

SQLite 错误:无法在具有非常基本的表的事务中启动事务

我是 SQL 新手,正在学习 SQLite 编辑器。所以我创建了几个非常简单的表格。这段代码直接来自Linkedin学习“SQL基础培训”,我使用的是推荐的SQLite编辑器。

CREATE TABLE widgetInventory(
    id INTEGER PRIMARY KEY,
    description TEXT,
    onhand INTEGER NOT NULL);

CREATE TABLE widgetSales(
    id INTEGER PRIMARY KEY,
    inv_id INTEGER,
    quan INTEGER,
    price INTEGER);
Run Code Online (Sandbox Code Playgroud)

然后我更新widgetInventory一些数据:

INSERT INTO widgetInventory (description, onhand) VALUES ('rock', 25);
INSERT INTO widgetInventory (description, onhand) VALUES ('paper', 25);
INSERT INTO widgetInventory (description, onhand) VALUES ('scissors', 25);
Run Code Online (Sandbox Code Playgroud)

接下来,我要更新widgetSales带有销售的表,并更新widgetInventory表以记录减少的情况onhand

BEGIN TRANSACTION;
INSERT INTO widgetSales (inv_id, quan, price) VALUES (1,5,500);
UPDATE widgetInventory SET onhand = …
Run Code Online (Sandbox Code Playgroud)

sqlite sqltransaction

5
推荐指数
1
解决办法
1万
查看次数

仅插入新行而不执行任何选择时 SQL Server 死锁

我在我的应用程序中看到持续的死锁,即使它不执行 select 语句、delete 语句和 update 语句。它只是插入全新的数据。

TL;DR:这似乎与外键有关。如果我删除它,那么我根本不会遇到任何死锁。但由于显而易见的原因,这不是一个可接受的解决方案。

鉴于下表结构

CREATE TABLE [dbo].[IncomingFile]
(
    [Id] UNIQUEIDENTIFIER NOT NULL, 
    [ConcurrencyVersion] RowVersion NOT NULL,
    CONSTRAINT [PK_IncomingFile] PRIMARY KEY CLUSTERED([Id])
)
GO

CREATE TABLE [dbo].[IncomingFileEvent]
(
    [Id] UNIQUEIDENTIFIER NOT NULL, 
    [ConcurrencyVersion] RowVersion NOT NULL,
    [IncomingFileId] UNIQUEIDENTIFIER NOT NULL,
    CONSTRAINT [PK_IncomingFileEvent] PRIMARY KEY CLUSTERED([Id]),
    CONSTRAINT [FK_IncomingFileEvent_IncomingFileId]
        FOREIGN KEY ([IncomingFileId])
        REFERENCES [dbo].[IncomingFile] ([Id])
)
GO
Run Code Online (Sandbox Code Playgroud)

当我遇到多个并发任务插入数据时,我总是看到一个死锁。READ_COMMITTED_SNAPSHOT在我的数据库选项中启用(即使我没有阅读)。

这是将重现该问题的代码。如果您没有遇到问题,请增加NumberOfTasksPerCpu程序顶部的常量。

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace …
Run Code Online (Sandbox Code Playgroud)

sql-server sqlconnection database-deadlocks sqltransaction

5
推荐指数
1
解决办法
357
查看次数