据我所知,如果我们开始交易(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/