sql - 事务不因 PK 违规而回滚

标签 sql sql-server transactions

据我所知,如果我们开始交易(begin tran/commit tran),它将完全完成或什么都不做。但是当我在 TSQL 代码下执行时,第一个 insert 语句起作用,而第二个语句不起作用。

背景:A表有两列(ID主键,Name varchar),已有3行数据(ID为1,2,3)。

begin tran
    insert into A values (4, 'Tim') -- this works 
    insert into A values (2, 'Tom') -- this doesn't work because it violates the PK constraint
commit tran

select * from A

这是我的问题:由于第二个insert语句违反了PK约束并且无法提交,我在想这个事务中的所有内容都应该全部回滚,因为事务应该是成功的或作为一个整体失败。但实际上,'Tim'被添加到 A 而'Tom'没有。这是否违反了交易的自动化?

最佳答案

这取决于您如何处理交易中的错误。如果您捕获它们,或者如果您忽略它们(看起来您正在忽略它们),那么事务将继续并提交。

任何像样的编程语言/框架的“事务管理器”:

  • 将停止代码的执行并将事务回滚,或者
  • 破坏事务,因此永远不会执行提交。它将被回滚代替。

如果您在 SQL 提示符下运行这些命令,您可能没有使用任何事务管理器,这就是为什么您可能故意忽略错误并继续进行,就好像一切都很好。

关于sql - 事务不因 PK 违规而回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61623516/

相关文章:

mysql - 表中的数据库列限制

php - 如何仅使用提交按钮更新填写的输入?

sql-server - ORDER BY 子句会减慢查询速度吗?

c# - 在 WinXP 上使用 .NET 的文件系统事务

delphi - 数据库间交易监控

MySQL:在事务中截断表?

sql - 删除 treasure-data/hadoop 中的查询?

php - 如何在 php mysql 中查找具有相同值的行数

c# - 用于统计的 SQL 单独数据集 - DataTable 的集合

mysql - 每 5 分钟将 MSSQL 数据复制到 MySQL DB?