MS SQL SERVER 2008。Qt + ODBC
我试图通过回滚最高级别的事务来回滚数据库中的一些更改(这些更改是在内部进行的)。但是看起来我的第二个db.transaction()调用并没有完全增加@@TRANCOUNT和第一个提交(内部)关闭事务。因此,外部事务级别上的下一个rollback命令被忽略了。
举个例子。注释字符串显示@@TRANCOUNT在每个操作之后从DB接收到:
db.transaction(); //@@TRANCOUNT = 0
query->exec("INSERT I
我使用了三个insert语句,如果第三个语句中有错误,我希望回滚第一个和第二个语句。如果无法做到这一点,请告诉我在PostgresqQL中处理此问题的另一种方法。
如果我使用COMMIT或ROLLBACK,我会得到一个错误。
CREATE OR REPLACE FUNCTION TEST1 ()
RETURNS VOID
LANGUAGE 'plpgsql'
AS $$
BEGIN
INSERT INTO table1 VALUES (1);
INSERT INTO table1 VALUES (2);
INSERT INTO
我需要为几个存储过程创建一个错误处理方法。
Proc1
CREATE PROCEDURE dbo.Proc1
AS
BEGIN TRY
BEGIN TRANSACTION
EXEC Proc2
INSERT INTO tableA (col1, col2) values (1,GETDATE())
--do something that causes error
SELECT 1/0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THRO
我有以下问题。我必须存储过程(调试消息双缩进):
CREATE PROC innerProc
AS
BEGIN
SELECT 'innerProc 1',@@TRANCOUNT
BEGIN TRAN
SELECT 'innerProc 2',@@TRANCOUNT
ROLLBACK
SELECT 'innerProc 3',@@TRANCOUNT
END
GO -----------------------------------------
CREATE PROC oute
以下代码按预期运行。插入行。
create table #t1(a datetime2)
declare @s nvarchar(max) = N'
-- Some expensive remote query should not be in the transaction
begin tran
insert #t1 select getdate()';
exec (@s);
commit; -- replace commit to rollback will rollback the transaction
select * from #t1
但是,它得到了以下错误
经过两天的批处理、回滚和..catch测试后,我的头脑仍然模糊。为了澄清我的问题,我把我正在做的事情分成两步。
1.回滚批处理,在线图书解释说,在批处理中,执行的语句只能回滚,除非批处理在事务中,而批处理中的错误导致事务回滚。
所以我把这个批处理成一个事务,就像
begin transaction
create table A ...
insert into A values...
insert into A values... (error here!)
insert into A values...
GO
rollback
这适用于错误输
如何将嵌套存储过程的值插入到表中。例如,如果我创建了一个这样的存储过程。
Create procedure New
begin
create table #tmp
(
id int,
name varchar(50)
);
insert into #tmp
exec stored_procedure 1,2;
insert into #tmp
exec stored_procedure 1,2;
假设在HTTP请求处理程序中有以下代码:
// these come from the HTTP request payload.
var channel = {};
var screencast ={};
try {
connection.beginTransaction(function(err) {
if (err) {
throw err;
}
connection.query('INSERT INTO Channels SET ?', channel, function (err, result) {
if (
我有一个带有事务的TRY/CATCH块,我希望根据执行存储过程的结果回滚该事务。 BEGIN TRY
BEGIN TRAN
INSERT Record
--Business validation
EXEC StoredProcedure --This should throw error
PRINT 'Commit Tran'
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT 'In CATCH Block'
我有一个存储过程,其中只执行3个存储过程。如果主SP成功,我只使用一个参数来存储。
如果第一个存储过程在主存储过程中工作良好,但是第二个存储过程失败,那么它会自动回滚主SP中的所有SP,还是必须发出一些命令?
这是我的程序:
CREATE PROCEDURE [dbo].[spSavesomename]
-- Add the parameters for the stored procedure here
@successful bit = null output
AS
BEGIN
begin transaction createSavebillinginvoice
作为,
如果我有一个内部存储过程,这总是没有错误回滚。
CREATE PROCEDURE [inner] AS BEGIN
SET XACT_ABORT, NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF (1 + 1 = 2) BEGIN
ROLLBACK TRANSACTION;
END ELSE BEGIN
COMMIT TRANSACTION;
END
END TRY
BEGIN
对于这个线程中有关“嵌套事务”的tsql代码,我有一个问题(不幸的是,我的声誉不足以在该线程中进行评论):在什么情况下,当XACT时,可以从CATCH块内部提交事务_中止设置为ON?。
下面是一个带有事务的过程--如果@@trancount >0,那么检查和保存点,但是当过程的catch块中有一个“上升错误-语句”时,我看不到savepoint有什么区别。这不会迫使调用代码回滚到调用代码的开头,从而忽略保存点吗?
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @tranc
基于以下代码:
/* This SP takes a query and a unique temporary table name as input...
The outputs is a string with the command to create the tmp table based on the query that is given in the @SRC parameter
*/
EXEC dbo.createTmpFromQuery @SRC,@uniqueTMP,@createTmpStr=@SQLStr OUTPUT
/* This executed the q
我有这样的疑问:
use DataIncremental
go
DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)
BEGIN TRAN tran2
DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
BULK INSERT accn_adjustments
FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201112302112.
我有一个after insert/update/delete触发器,它在每次对特定表执行插入/更新/删除操作时在AuditTable中插入一条新记录。如果在AuditTable中插入失败,我希望插入第一条记录,并将错误记录到另一个表"AuditErrors“中。
到目前为止,这就是我所拥有的,我尝试了许多不同的方法,但是如果触发器插入AuditTable失败(我通过在AuditTable插入中拼写错误的列名来测试),我就不能让它工作。注意:@sql是插入到AuditTable中的。
DECLARE @TranCounter INT
SET @TranCounter = @@TRANCO
我所拥有的是一个存储过程(A),它创建一个临时表(T)并调用另一个过程(B)。B插入到T中,但是由于它是在A中创建的,因此构建警告我,T在B<code>E 215</code>中是未知的。如果代码对您更有意义,那么这里就是:
BEGIN TRAN
GO
CREATE PROCEDURE dbo.B
AS
BEGIN
INSERT INTO #T VALUES (1)
INSERT INTO #T VALUES (0)
INSERT INTO #T VALUES (1)
END
GO
CREATE PROCEDURE dbo.A
AS
BEGIN
请参阅以下代码:
ALTER PROCEDURE GetPerson
AS
BEGIN TRANSACTION;
BEGIN TRY
DECLARE @TestVariable1 AS INT;
DECLARE @TestVariable2 AS INT;
SET @TestVariable1 = 1;
SET @TestVariable2 = 0;
DECLARE @TestVariable3 AS INT;
SET @TestVariable3 = @TestVariable1 / @TestVariable2;
PRINT
RollBack () 和 beginTransaction() 在PDO中不工作,我的表类型是 innoDB**.在下面的代码中,我的** $sql1 是正确的,我的 $sql2 是错误的(我在 $last_id 中添加了 d 以使其出错)。但是它仍然执行sql1,意思是回滚没有效果。感谢您的建议。
<?php
include 'connect.php';
// Get multiple input field's value
try {
// set the PDO error mode to exception
$conn->setA
所以我不能说得太具体,但我想我能告诉你的就足以解决这个问题了。首先,我用gorp来设置事情并得到交易。我正在使用github.com/denisenkom/go-mssqldb驱动程序。
然后,我运行了一系列操作,如果这些操作失败,我就rollback,如果所有操作都成功的话,我commit。问题是,它只是回滚失败的语句,而不是其他操作。难道我错了吗?
下面是一些粗略的psudocode,让您更好地了解我在说什么:
trans,err := dbmap.Begin()
//assume all errors are received and checked before continuing
我有一个示例代码,它创建一个表,在其中插入一些行,然后尝试取消整个事务,但是conn.rollback()似乎只对INSERT语句有效,而created不受影响:新创建的表在数据库中保持永久不变,没有插入任何行。
这是在MySQL数据库管理系统中使用JDBC驱动程序时的标准行为吗?
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestBatch {
public stati
我有一个BasicMSI项目(InstallShip2009),它在安装过程中运行一个SQL脚本。在安装过程中,我收到以下错误。
错误27506。执行SQL脚本{SCRIPTNAME}时出错。352行。')‘附近的语法不正确。(102)
问题是我在脚本的第352行没有任何')‘,而且如果我使用SQL Management Studio Express运行它,脚本也可以正常工作。
有人能告诉我问题出在哪里吗?我该如何解决它?谢谢。
PS。我不能将脚本错误处理选项设置为"On Error,Goto Next Statement“,因为它不会为此创建一些外键。
IF NOT
假设我有一个打开的Server会话,并执行以下操作:
begin tran
insert into People (Id) values (1)
select @@TRANCOUNT -- Prints 1
save transaction tt
begin tran
select @@TRANCOUNT -- Prints 2
insert into People (Id) values (2)
好吧,现在我做了一个:
rollback tran tt
select @@TRANCOUNT -- Prints 2!
我的问题也许很明显:
为什么部分回滚不通过内部事务增加@@T
首先,我试着解释一下当时的情况。我将过滤器表达式存储在由换行符分隔的一列中。基本想法是这样的:
SELECT
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + ''''
FROM dbo.topic_filter T
WHERE
T.id = @id
FOR XML PATH('')
在此之后,我只需执行此字符串将数据放入临时表中。我的问题从这里开始。该代码段位于存储
我在SQL Server2005中执行此操作。我有一个表,只有一个int类型的列,你不能在其中插入char。
如果我运行这个命令,我会在我的表中插入一行。
INSERT INTO TestTable VALUES(3) --success
INSERT INTO TestTable VALUES('b') --fail, cannot insert char
如果我运行这个命令,我会在我的表中插入零行。因此,一个事务将2个任务组合到单个执行单元中。如果一个任务失败,则整个事务都会失败。
BEGIN TRANSACTION
INSERT INTO TestTable VA
我能否在事务中运行动态sql并使用EXEC回滚:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
将其放入事务中,并在exec语句之后使用@@error进行回滚。
例如:代码
BEGIN TRANSACTION
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
ELSE