【问题标题】:Are schema modifying commands transactional?模式修改命令是事务性的吗?
【发布时间】:2010-01-25 16:31:15
【问题描述】:

例如,如果我删除了一个表然后回滚事务是重新创建表吗?

可以在事务中进行的架构更改有哪些限制?

如果以上取决于Sql Server的版本,请说...

背景
我正在考虑使用一些“select into”语句来创建表,然后需要删除上述所有表作为工作流的后期部分。

表格中的行数都不会超过几十行。

【问题讨论】:

标签: sql-server transactions


【解决方案1】:

大多数数据库对象 DDL 语句可以是用户事务的一部分。存在一些例外情况,例如与数据库本身文件相关的操作(例如 ALTER DATABASE ... ADD/REMOVE FILE)。同样在服务器级别,大多数对象都可以成为事务的一部分。例外是端点之类的对象,它们可能会启动或停止侦听套接字。

一般的经验法则是,如果只是元数据操作,那么它可以是事务的一部分。如果是具有外部副作用的操作(创建文件、打开套接字等),则它不能成为事务的一部分,因为无法保证回滚。

绝大多数 DDL 语句只是元数据,它们所做的只是修改一些元数据目录表(例如,它们在 sys.tables 中添加行),因此它们的行为就像任何其他事务操作一样:如果事务是回滚该行被删除,因此表“消失”。它有更多细节(例如,sys.tables 是像 sys.objects$ 这样的真实内部表之上的视图,这是由 CREATE TABLE 修改的真实表),但在高层次上,这就是正在发生的事情。

【讨论】:

    【解决方案2】:

    为什么不自己测试你的场景呢?

    我刚试过 - 花了 2 分钟。

    USE [MY_DB]
    GO
    /****** Object:  Table [dbo].[TestTable]    Script Date: 01/25/2010 12:01:05 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[TestTable](
        [testfield] [varchar](50) NULL
    ) ON [PRIMARY]
    
    GO
    SET ANSI_PADDING OFF
    
    BEGIN TRAN
    
    DROP TABLE TestTable 
    
    ROLLBACK
    

    【讨论】:

    • 为什么我不只是测试这个:因为我们支持 3 个版本的 sql server(具有不同的服务包)等,所以仅仅因为它在我的机器上工作不会告诉我匹配。
    • 如果你从最旧的版本开始,它会告诉你很多。
    【解决方案3】:

    线程坏死,使用批处理时似乎不再是这种情况,只需运行下面的代码,在 ms sql server 2008 r2 中,以下不回滚:

    begin tran
    go
    create table AATableThatDoesNotExist
    (
    blah int null
    )
    go
    create table AATableThatDoesNotExist
    (
    blah int null
    )
    go
    create table AATableThatShouldNotExist
    (
    blah int null
    )
    rollback tran
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 2015-09-09
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多