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你测试过这个吗?请这样做,然后给我回电话。你会发现我不是在这里犯错误的人…:)