问题标签 [sqltransaction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
864 浏览

sql - 在存储过程中使用事务时出现的问题

我遇到了一个与 SQL 相关的问题,现在让我很生气:p。这是我的设置:

我有 2 个存储过程:

父存储过程被调用GenerateAnnualPenalty

GenerateAnnualPenalty其中有一个 SELECT CURSOR,它遍历一系列名为 的对象Properties,并且对于每个Property,它确定是否Penalty需要应用 a 。这存储在一个名为 的布尔变量中@ApplyPenalty,以及它的0or 或1。此外,在GenerateAnnualPenalty.

其次,对于每个Property迭代GenerateAnnualPenalty,它调用一个名为的子存储过程GenerateAnnualPenaltyForProperty@ApplyPenalty作为输入传递给GenerateAnnualPenaltyForPropertyGenerateAnnualPenaltyForProperty确实使用 SQL 事务(提交/回滚)。

我在名为 的表中输入条目DebugLog,以标记代码中是否已到达特定点。

这是孩子的骨架GenerateAnnualPenaltyForProperty

问题(简介):

假设以这个特定的顺序GenerateAnnualPenalty迭代 4 Properties(利用了这个问题):

要迭代的第一个属性:@PROPERTY_ID = 1

要迭代的第二个属性:@PROPERTY_ID = 2

要迭代的第三个属性:@PROPERTY_ID = 3

要迭代的第四个属性:@PROPERTY_ID = 4

假设对于属性 1、3 和 4,ApplyPenalty = 1,而对于属性 2,ApplyPenalty = 0

问题(主要症结):

GenerateAnnualPenaltyForProperty调用属性 1 时,一切都很好:我在表中看到了检查点 1 和检查点 2 条目DebugLog

GenerateAnnualPenaltyForProperty调用属性 2 时,一切都恢复正常:我在表中同时看到检查点 1 和检查点 2 条目DebugLog

GenerateAnnualPenaltyForProperty调用属性 3 时,会出现不正确的情况:我只看到表中的检查点 1 条目DebugLog,而“检查点 2”条目也应该是可见的!

GenerateAnnualPenaltyForProperty调用属性 4 时,它再次正确:我再次在表中看到检查点 1 和检查点 2 条目DebugLog

因此,问题仅发生在 的 属性中ApplyPenalty = 1,前提是在之前的迭代中,ApplyPenalty = 0。在这种情况下,带有的属性ApplyPenalty = 1会被视为ApplyPenalty = 0

禁用 SQL 事务代码可以解决问题,但为什么?:

如果我禁用所有GenerateAnnualPenaltyForProperty与 SQL 事务相关的代码,一切正常!纠正了上述有问题的情况。这是一个框架GenerateAnnualPenaltyForProperty,其中已取出 SQL 事务代码,它适用于:

问题(???):

为什么会出现这种行为?为什么当我使用 SQL Transaction commit/rollback intoGenerateAnnualPenaltyForProperty时,存储过程不适用于有问题的情况?

实际代码:

如果有人希望查看子存储过程的完整代码,则可在此处获得:https ://gist.github.com/anonymous/5214236

0 投票
1 回答
4889 浏览

sql - 触发器中的事务处理(TRY/CATCH....XACT_ABORT ON)

我在 SQL Server 2008R2 上有流程场景:

• 一个usp 收集数据,然后在两个SQL Server 之间传输数据

此过程将在流程的所有级别(usp、SSIS 和触发器)的事务中完成

在此处输入图像描述

在将数据传输到 DB7.dbo.Dest 的数据流中,该表有一个 AFTER INSERT 触发器,它将刚刚通过的数据插入到最终表 DB7.dbo.FinalDestination 中:

在每个级别,由于数据的敏感性正确并完全进入决赛桌,我都试图对数据进行防御。

关于 SSIS,从我阅读和测试的内容来看,它似乎工作正常。

我最担心的是我在上面编写的触发器。根据我的阅读和理解,设置 XACT_ABORT ON 将在出现任何错误时回滚 TRY 块内的事务(换句话说,存在不可提交的事务)。在这种情况下,我继续在 CATCH 块中添加回滚事务部分作为一个想法,因为它永远不会到达(根据我的理解)。同时,我添加了 WITH (TABLOCK) 选项,以便在执行 INSERT 时锁定表。

在触发器的情况下,在 XACT_ABORT 为 ON 的情况下,TRY...CATCH 是否必要?TRY 块内是否需要 COMMIT TRANSACTION?正如我也看到它在基于 @@TRANCOUNT 的 CATCH 块之后提交

欢迎回答和批评,并在此先感谢您。当我试图概括名称时,请原谅任何错别字......

0 投票
1 回答
564 浏览

java - 从Java执行时Psql脚本未提交

我有一个执行 psql 命令以导入 SQL 脚本文件的 .bat 文件。当我从 Windows 命令行执行 .bat 文件时,它可以正确执行。但是当我从 Java(使用 ProcessBuilder)调用 .bat 文件时,脚本并没有结束。我没有收到任何错误,在 InputStream 中没有,ErrorStream 甚至在 DB(Postgresql)日志中也没有。

SQL 脚本很长,所以我不添加它。该脚本的底部确实有一个 COMMIT 语句。

有任何想法吗?谢谢,

0 投票
1 回答
1096 浏览

c# - SQL Server Sequence Gaps

I have a SEQUENCE that I used to set the transaction folio of a table:

Today just for curiousity I did a:

and what was the surprise that there are gaps, so there are missing folios in the table.

Example:

  • 898, 897, 894, 892, 890, 889 ...

That means that something is happening. Just to give more information, the INSERT stored procedure that I used has the following before the INSERT INTO...

When saving the information from my application I used database transactions, so if everything goes well then the app does the COMMIT TRANSACTION and if not I do the ROLLBACK TRANSACTION.

I think that the origin of the problem is the transaction, so when there is an error the NEXT VALUE of the sequence has been already generated and the ROLLBACK has no effects on that.

Any clue how to solve this in order to have a perfect sequence without gaps?

0 投票
3 回答
5091 浏览

c# - 多个方法上的单个 sql 事务

模块化编程是正确的方法,但它有时会导致需要额外努力和研究的问题。我有三个数据库插入功能,InsertName(),InsertAddress(),InsertPhoneNo()以它为例。如果任何函数发生异常,所有这些函数都必须执行,不会对数据库进行任何更改。

我能做的是将所有三者合二为一并使用sqltransaction。

但上面的解决方案与我的模块化方法背道而驰。是否可以将多个函数绑定到一个 sql 事务而不合并它们,如果没有,这是实现这一目标的最佳方法。

0 投票
1 回答
208 浏览

c# - 是否可以在同一张表上的 DML 事务中间进行 ALTER TABLE (DDL)?

比如说,您从 C# 开始一个 SqlTransaction,在其中您将 DataTable 中的数据插入到 SQL 表中,但是这些数据是大量数据,因此您在 SQL 事务中使用 SqlBulkCopy 进行“分块”,并且只提交如果所有块都成功复制,则交易。

现在,假设您知道插入的值的长度有时会超过目标表中的最大列大小,因此 SqlBulkCopy 将在该特定“块”的点上失败。是否有可能(甚至可取)捕获此异常并更改表/列以增加目标列的最大长度,然后继续 SqlBulkCopy'ing 数据拾取下一个要复制的“块”,即使您没有提交了您开始的“插入交易”?

那么,试着解释一下,是否可以启动一个 DML 事务,在这个未提交的事务中间停止,执行一个 DDL 来更改目标表,然后完成原始 DML 并提交它?

0 投票
1 回答
1216 浏览

php - PHP + MySQL - 事务不回滚

我正在使用旧式mysql_query()函数来执行事务。即使事务中的一个查询失败,它也不会回滚。我已经调试了受影响的行,它们是 0 或 1。语法如下:

0 投票
1 回答
1472 浏览

mysql - 将 MySQL 事务应用于我的购物车结帐流程

我有一个我不久前建立的在线商店,我一直在产品库存表上使用 LOCK TABLES 来确保库存不会低于 0 或没有正确更新。

最近数据库上有很多流量和很多操作(还有一些其他的 LOCK TABLES),所以我一直在问自己是否有更快、更安全的方法来保持数据的一致性。

我正在尝试了解交易及其工作方式,我想知道以下逻辑是否会成功应用于我的结帐流程:

1) START TRANSACTION (以便可以回滚任何后续查询,如果其中一个失败或其他一些条件(如库存低于需要))

2)在“客户”表中插入客户

3) 在“订单”表中插入订单信息

4)对不同表的相似查询

5)对于购物车中的每个产品:

5.1) 更新产品集 stock = stock - x where stock - x >= 0 (x 是客户想要购买的任何单位)

5.2)检查受影响的行,如果受影响的行== 0,则回滚并退出(当前产品的库存不足,因此取消订单/抛出错误)

5.3)一些其他查询......等等......

6) 提交

这听起来正确吗?

我没有得到(并且不知道我是否应该首先关注)是“产品”表和库存数据会发生什么,如果某个并发会话(另一个客户)试图放置相同的订单或包含某些相同产品的订单。

第二个事务会等待第一个事务完成并且第二个事务使用最新的库存数据,还是它们会同时运行并且在某些情况下可能都失败或什么?

0 投票
1 回答
2020 浏览

sql-server - XACT_ABORT 的范围是什么

SQL Server 2005 中的 SET XACT_ABORT 语句的范围是什么?即:开始-结束块、过程或触发器、连接、数据库、服务器?

0 投票
1 回答
1301 浏览

java - JDBC事务,sql语句的执行顺序

我有以下 JDBC 代码:

我希望 2 个准备好的语句成为一个 JDBC 事务的一部分。我想知道它们的创建顺序是否将是 SQL 语句的执行顺序:首先删除,然后插入。