Grails dbm-update & change_log 变更集:事务性与否?

Grails dbm-update & change_log changesets: transactional or not?

我的印象是迁移脚本中的变更集是事务性的,但我发现实际上它们不是。

对于最简单的示例,创建一个基本的变更集条目,可能如下所示:

changeSet(author: "some_email@server.com", id: "1-1", description: "An example changeset for a changelog.groovy.") {
    createTable(tableName: "table_name") {
        column(autoIncrement: "true", name: "id", type: "BIGINT") {
            constraints(nullable: "false", primaryKey: "true")
        }

        column(name: "version", type: "BIGINT") {
            constraints(nullable: "false")
        }

        column(name: "name", type: "VARCHAR(64)") {
            constraints(nullable: "false")
        }

        column(name: "name", type: "VARCHAR(64)") {
            constraints(nullable: "false")
        }

    }

}

现在,显然我们不能添加两个同名的列,所以这应该会失败 - 并回滚。但它不会回滚。 table 已创建并添加了第一列 - 尽管它是一个 "bad" 变更集。

所以,问题是 -

1) 是 changelog.groovy 变更集事务吗?

2) grails dmb-update 应该以事务方式执行变更集吗?

3) 如果是这样,是我们配置错了什么?

Grails 中的数据库迁移不是事务性的。如果您需要回滚失败的变更集的能力,您必须自己编写回滚。

正如伯特指出的那样 "The primary issue is that transactions, rollback, etc. are primarily a data/DML concept. Some databases have at least partial support for rolling back structural/DDL changes, but it's very impractical in the general case"。