Grails dbm-update& change_log changesets:是否是事务性的?

时间:2016-05-27 16:20:39

标签: grails transactions gorm

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

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

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")
        }

    }

}

现在,显然我们不能添加两个同名的列,所以这应该失败 - 并且回滚。但它并没有回滚。创建该表并添加第一列 - 尽管它是一个"坏"变更。

所以,问题是 -

1)是changelog.groovy changesets transactions?

2)grails dmb-update是否应该以事务方式执行更改集?

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

1 个答案:

答案 0 :(得分:2)

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

Burt指出"主要问题是交易,回滚等主要是数据/ DML概念。一些数据库至少部分支持回滚结构/ DDL变化,但在一般情况下它是非常不切实际的。#/ p>