sql-server - 在单个更新语句上使用事务

标签 sql-server transactions

我在工作中为一些 SP 配音,我发现编写代码的人在像这样的单个更新语句上使用了事务

begin transaction 
*single update statment:* update table whatever with whatever
commit transaction

我知道这是错误的,因为当您想要更新多个更新时使用事务。 我想从理论角度理解,使用上述代码的含义是什么? 在有事务和没有事务的情况下更新无论什么表有什么区别吗?有没有额外的锁什么的?

最佳答案

可能由于之前或将来可能涉及其他数据的代码而包含该交易。也许开发人员只是养成了将代码包装在事务中的习惯,以确保“安全”?

但是,如果该语句实际上只涉及对单行的一次更新,那么在这种情况下该代码确实没有任何好处。事务不一定“锁定”任何东西,尽管其中执行的操作当然可以。它只是确保其中包含的所有操作都执行全有或全无。

请注意,事务与多个表无关,而是与多个更新有关。它确保多次更新发生,要么全有,要么全无。

因此,如果您将同一个表更新两次,无论有没有事务都会有差异。但您的示例仅显示一条更新语句,大概只更新一条记录。

事实上,事务将多个更新封装到同一个表中可能很常见。想象一下以下情况:

INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200)
INSERT INTO Transactions (AccountNum, Amount) values (2, -200)

这应该包含在交易中,以确保资金正确转移。如果其中一个失败,另一个也必须失败。

关于sql-server - 在单个更新语句上使用事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12369619/

相关文章:

mysql - SQL通过将列舍入到最接近的值来返回基于两列的不同行

c# - GUI 线程上的 IDbConnection.BeginTransaction,使用异步/等待,导致多次调用死锁

grails - 防止保留未使用的数据库连接

node.js - redis 和 watch + multi 允许并发用户

python - 在事务中插入两个条目并得到 'Cannot operate on different entity groups in a transaction' 错误

mysql - 在数据库事务期间等待另一个进程

c# - Powershell 结果集未在 C# 中获取

c# - 在 DB 中自动聚合数据的最佳方法

MySQL 查询到 SQL Server 查询

sql-server - 表变量中的表数据类型