sql - 如果发生错误,此事务是否会回滚

标签 sql sql-server sql-server-2014

我有一个事务要提交,但不确定如果出现任何问题是否会回滚。我知道我可以在 c# 中使用 TransactionScope,如果发生错误,一切都将回滚。但是我不太确定存储过程中的事务。网上所有的例子都有一个回滚,使用ROLLBACK关键字。如果我没有 ROLLBACK 关键字会怎样?

CREATE PROCEDURE CreatePost
    @type INT,
    @name VARCHAR(500)
AS
BEGIN
    DECLARE @insertedId TABLE(Id INT)
    DECLARE @id INT

    BEGIN TRANSACTION

    INSERT INTO [Post] ([Name], [Type])
    OUTPUT inserted.Id INTO @insertedId
    VALUES (@name, @type)

    UPDATE [Tables] SET Ordinals =ordinals + 1
    WHERE Id = @tableId

    COMMIT
END

最佳答案

是的,如果事务没有到达COMMIT 语句,它会自动回滚。

这是一个简单的例子

样本表

create table tt(id int)

示例程序

CREATE PROCEDURE CreatePost
AS
BEGIN

    BEGIN TRANSACTION

    INSERT INTO tt values (1)

    select cast('ldfsfds' as int)

    COMMIT
END

执行程序并查询表

EXEC CreatePost    
select * from tt

结果

0 records

假设在执行过程之前没有记录,最终结果将是一个空表。

关于sql - 如果发生错误,此事务是否会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446851/

相关文章:

sql - 如何使用 T-SQL 组合多个不同长度的父子关系?

sql-server - 多数投票 SQL

sql - 查找在逗号分隔值内包含相同值的行

sql - 条件 update_all 与 ActiveRecord 中的连接表?

mysql - IN Mysql函数如何返回多行

mysql - 导出没有主键的表数据

mysql - SQL查询使用查询同一个表的子查询来过滤行

sql - 设置 SQL 查询格式以不同方式显示

PHP+MySQL 打印查询结果

join - 在 Select 中合并两个表 (Microsoft SQL Server 2014)