我有一个循环,我在其中调用具有不同参数值的存储过程。下一次调用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) 在 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 的情况下,但在其他类型的异常的情况下它不起作用。有人也可以澄清这一点吗?
一旦事务开始,是否可以延长事务的超时(使用SQL Server)?
.net sql-server transactions transactionscope sqltransaction
所以我有多个SqlConnections我想要在一个中使用SqlTransaction.我知道我只能使用一个连接,但最终在每个连接中都有大量新声明和无用(在连接完成后)变量,并且我需要程序尽可能快地保持.
我在using声明中有每个Connection .
我使用的是最新的.NET和SQL Server 2008 R2.
可能吗?
另外,我已经看过了:
如何在.NET中为多个SqlConnections使用单个SqlTransaction?
没有人回答这个问题,平台已经过时了.
我试图只使用一个连接并一起运行两个命令,一个使用事务,一个不使用.
没有跟踪/日志记录功能,因为此解决方案部署在另一个位置.因此,当流程部分失败时,我至少可以按照日志进行操作.
我将在这里添加我的测试代码:
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属性尚未初始化.
如果没有其他无交易连接,有没有办法实现我想要做的事情?
或者,如果有一个更好的建议,以不同的方式通过单个连接优化我的代码,我就可以开始学习它.
我有一个存储过程具有以下代码:
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
我不确定如何在多个SELECT查询中实现一致的读取。
我需要运行多个SELECT查询并确保它们之间没有UPDATE,DELETE或者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
我是 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) 我在我的应用程序中看到持续的死锁,即使它不执行 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) sqltransaction ×10
c# ×5
sql-server ×3
transactions ×2
.net ×1
commit ×1
connection ×1
mysql-5.6 ×1
npgsql ×1
postgresql ×1
rollback ×1
sql ×1
sqlcommand ×1
sqlite ×1
try-catch ×1