Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么在进行事务时需要回滚命令,或者告诉我何时使用“回滚”命令;“回滚”;_Sql_Sql Server - Fatal编程技术网

Sql 为什么在进行事务时需要回滚命令,或者告诉我何时使用“回滚”命令;“回滚”;

Sql 为什么在进行事务时需要回滚命令,或者告诉我何时使用“回滚”命令;“回滚”;,sql,sql-server,Sql,Sql Server,在下面的代码中,当我在表中插入数据时,回滚的目的是什么?如果我想回滚,我不应该插入它。那么使用回滚的适当方法是什么 BEGIN TRANSACTION Insert into dimCustomr Values('xyz',345435353) ROLLBACK; 这通常不是您编写的方式。BEGIN TRANSACTION和ROLLBACK块通常有多条语句 回滚的目的是“回滚”在BEGIN TRANSACTION和rollback之间所做的任何和所有数据修改,以防任何工作单元由于任何错误而无法

在下面的代码中,当我在表中插入数据时,回滚的目的是什么?如果我想回滚,我不应该插入它。那么使用回滚的适当方法是什么

BEGIN TRANSACTION Insert into dimCustomr Values('xyz',345435353) ROLLBACK;

这通常不是您编写的方式。BEGIN TRANSACTION和ROLLBACK块通常有多条语句

回滚的目的是“回滚”在BEGIN TRANSACTION和rollback之间所做的任何和所有数据修改,以防任何工作单元由于任何错误而无法执行

这通常在您执行任何只有在后续事务成功时才有意义的事务时有用,否则之前的事务也不应生效

举个简单的例子。
如果您先过帐发票,然后还进行负库存更改。通过过帐发票开始交易,然后尝试使库存为负数(由于任何错误而失败),然后当发票包含在同一开始交易和回滚块中时,发票也将被还原。

如果交易中止,将执行回滚。它会使整个事务撤消。
在运行事务时,或在系统意外断电的情况下,事务可能会由于一些错误而中止。

回滚用于维护数据库的完整性。所以它要么是满的,要么没有。例如,假设有10行要插入到表中,第8行出现问题,那么在这种情况下,所有事务都将回滚


在begin和end中运行事务使我们能够控制事务,以便在出现任何错误时回滚或提交。当我们发布Rollback语句时,事务所持有的任何资源也会被释放,

已经说了很多,所以让我用一个例子来形象地描述它:

您想进行大额交易:

您有
部门
表,表中有列:
名称
员工
,等等

您不允许一个部门在没有员工的情况下存在于表中

现在你必须介绍新的部门。因此,您可以获得名称并进行
insert
。现在您有了不需要的情况,您有了name,但其余的列为null(
Employee
也为null)。这没关系,因为您有一个脚本可以立即用
员工数更新记录,所以您有有效的记录

现在,如果
insert
update
之间出现问题(例如服务器不可用),该怎么办?您将留下无效记录

这就是为什么您应该在插入之前使用
开始事务
。然后,若
更新
成功,您将
提交事务
,但若更新过程中出现问题,您将使用
回滚事务
,所以无效记录将不再在表中(因为该更改将被回滚)

因此,即使发生意外情况,您也将拥有有效且一致的数据

我通常使用以下代码:

begin transaction
begin try
    --do some operations
    --if code was run successfully, we commit transaction
    commit transaction
end try
begin catch
    --if something bad happens, we don't know the state of data (consistency, etc.)
    rollback transaction
end catch

使用回滚方法,您可以关闭事务,恢复对数据库所做的所有相关更改。 例如:


上图一次演示了三个查询。query1和query2的转换成功,但query3出错。当query3出现错误时,所有事务都将恢复。

一般来说,如上所述。回滚是维护数据库完整性的一个选项。正如其他人已经深入这一理论,我将给出一个简短的实践例子

假设我要更新表中的两行。我有点害怕结果不是我想要的,然后我可以做以下事情:

 BEGIN TRAN
 UPDATE TableA
 SET ColA = 'New', ColB = 5544
 WHERE ID IN ('112233', '112234')

 SELECT ColA, ColB FROM TableA WHERE ID IN ('112233','112234')-Visual Check

 If the visual check confirms your expectation, COMMIT TRAN.

 If not, ROLLBACK TRAN.

不管怎样,事先的select语句是一个很好的基础,这可以用作双重检查。

回滚通常在交易过程中改变主意或遇到问题时使用。您的问题在这里不清楚。你能详细说明一下吗?您只是在问
回滚
是什么意思?如果是这样的话,也许可以阅读一下BOL?SQL Server没有隐式事务,在每个DML操作结束时都不需要提交或回滚任何内容。因此,在您的情况下,如果要回滚,必须在脚本末尾运行rollback TRANSome remark,直到在事务启动之前指定将XACT_ABORT设置为ON,如果遇到一些非高严重错误,SQL Server将不会自动回滚事务。这是一个很好的示例,但您不能假设OP知道C。另外,不要将代码粘贴为图片。您应该将代码复制粘贴为文本并正确设置格式。@MichałTurczyn我同意将代码作为文本发布的请求,但我不认为使用C#here会有问题(尽管我不使用它)。代码非常清晰,可以在C++或java中使用(如果提到的类可用)。因此,它可以被视为一种通用伪代码。您不能查询该表,因为它会被事务锁定。你应该更新你的答案和正确的代码,这样它才能工作。@MichałTurczyn你测试过这个吗?请这样做,然后给我回电话。你会发现我不是在这里犯错误的人…:)