我只是通过查看SQL分析器来尝试调试应用程序错误。 ( 我无法访问代码 )。
应用程序中的错误显示
现在,我在执行frontend命令时运行了SQL分析器,并尝试识别未提交的命令。我无法发布确切的查询,但我会发布他们的主要部分。
在以下更新状态后调用了探查器ROLLBACK
(据我所知,只回滚了INSERT / UPDATE / DELETE语句)。
UPDATE transactions
SET refference = N':ICBilling 8/9/2013'
,type1 = 1
,notes = N'Billing'
,dateModified = convert(DATETIME, N'08/09/2013 10:33:13AM', 101)
,moduleModifiedBy = N'PM'
WHERE transaction_id = 1100001368
我向上滚动探查器以查看之前发生的事情并发现此记录已插入transactions
表。
INSERT INTO transactions (
transaction_id,
uRefference,
Type1,
Notes,
ModuleModifiedBy,
)
VALUES (
1100001368
, NULL
, 0
, NULL
, convert(DATETIME, N'08/09/2013 10:33:13AM', 101)
)
在此插入之前有一个BEGIN TRANSACTION
命令。我假设因为INSERT
操作未被提交到Transactions
表中,UPDATE
语句会导致错误,因为它无法找到要更新的记录。
(虽然我已经在SQL Server中使用这些查询测试了这个想法。我创建了一个临时表并在begin transaction
之后一次性运行该部分)
CREATE TABLE #tempx (i INT);
INSERT INTO #tempx VALUES (1),(2),(3);
BEGIN TRANSACTION
INSERT INTO #tempx VALUES (4);
UPDATE #tempx
SET i = 5
WHERE i = 4
运行了查询并且UPDATE
执行没有问题,所以我有点消除了这种可能性。虽然我对直接来自SQL Server M.S的runnign查询之间的区别表示怀疑。并从应用程序中调用它们,并在进一步谷歌搜索后,我发现(here)必须设置一些参数才能进行隐式事务。
所以,我回到我的探查器,在顶部,这就是我找到的
SET QUOTED_IDENTIFIER ON
SET ARITHABORT OFF
SET NUMERIC_ROUNDABORT OFF
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET CONCAT_NULL_YIELDS_NULL ON
SET CURSOR_CLOSE_ON_COMMIT OFF
SET IMPLICIT_TRANSACTIONS OFF
SET LANGUAGE us_english
SET DATEFORMAT mdy
SET DATEFIRST 7
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
我还没有尝试将IMPLICIT_TRANSACTIONS
设置为ON
,因为这是一个生产数据库,我不完全确定会有任何问题。
所以,我想请求有更多经验的人帮助我找到或至少深入到可能出现问题的地方(代码或SQL Server设置)
更新
我设法访问了引发错误的部分代码
If Not myExceptionOccured And Not SessionKey Is Nothing Then
If SessionKey.Connection.IsInTranState Then
Dim Message As String = String.Format("Could not complete Page_Unload. There are {0} uncommitted transactions. All changes were rolled back.", SessionKey.Connection.TransactionCount)
所以很明显,会话没有被关闭,并且SQL Server没有提交事务。
我已尝试修改其他交易并且有效。但显然它只有这个交易有问题。我会尝试比较这些交易的两个分析器,也许我可以找到差异。
与此同时,如果有人认为我的方向错误,请发表评论。
更新#2:
就像我说的那样,我描述了另一个有效的事务,并查看了调用之后的回调。
在这两种情况下(在它工作和回滚的情况下)的查询都是这个(与我的问题开头时相同):
UPDATE transactions
SET refference = N':Billing 8/16/2013'
,type1 = 1
,notes = N'Billing'
,dateModified = convert(DATETIME, N'08/16/2013 12:47:25PM', 101)
,moduleModifiedBy = N'PM'
WHERE tranId = --transaction id here--
它们之间的唯一区别是它们更新的事务ID和时间(有GETDATE()
函数获取当前时间)。
就是这样。一个事务被提交,另一个事务没有。
还有其他建议吗?