如果我在 DBeaver 中执行此操作:
alter table classes alter column reference set not null;
在我的本地数据库(只有我在 DBeaver 中打开)上,它成功完成。
但是我无法在资源管理器中打开表,并且该列仍然显示为可空。
如果我尝试关闭 DBeaver,它会说有一个打开的事务,但我认为没有。
但是,如果我运行commit
,突然一切都正常,我可以查看表格并且该列显示为非空。
我以为 DDL 语句没有提交和回滚的概念:我是否必须在 Flyway 更新脚本中的每个语句之后提交?
一些DBMS会在ddl操作后自动提交,但postgres不是其中之一。
检查 dbeaver 中的设置,您可能已禁用自动提交。在我检查的 dbeaver 版本中,它位于此处:
关于 flyway,如果没有发生错误,它将在每个文件末尾执行提交。通常,不要在迁移文件中放置显式提交语句,否则会破坏迁移文件的幂等性。假设迁移文件如下:
Flyway 将在语法错误时回滚架构版本的事务,但由于提交,表 t 存在。如果您修复语法错误并再次运行 flyway,它将失败,因为 t 已经存在。
Flyway 对每个迁移文件使用两个事务。一个事务对架构历史表加排他锁,另一个事务运行迁移文件。如果迁移成功,第一个事务将新版本插入历史表并提交,即释放历史表上的锁。
将 DDL 置于事务控制之下是一件好事。对于不支持此功能的 DBMS,您需要实现撤消文件,这很麻烦。对于支持此功能的 DBMS,flyway 可以直接回滚事务。不用说,这要容易得多
你错了。
仅当您希望其他会话看到更改时才需要提交。