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"。
我的印象是迁移脚本中的变更集是事务性的,但我发现实际上它们不是。
对于最简单的示例,创建一个基本的变更集条目,可能如下所示:
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"。