当前位置: 首页 > 知识库问答 >
问题:

当Liquibase创建它的锁表时,我如何获得此Oracle异常?

辛弘壮
2023-03-14

我已经安装了DropWizard服务,以便在应用程序启动时自动进行任何液化迁移。

当我第一次启动我的Dropwizard服务时,我运行一个Liquibase::listLocks()以提供信息。此调用还将创建DATABASE CHANGELOGDATABASE CHANGELOGLOCK表,如果它们不存在作为副作用。

一旦在新的Oracle ATP DB上,它在调用listLocks期间创建锁表时抛出以下错误:

ERROR 2021-07-08 17:59:22,546  [main] com.blah.utils.LiquibaseMigrator: Error listing locks!
liquibase.exception.DatabaseException: ORA-12838: cannot read/modify an object after modifying it in parallel
 [Failed SQL: (12838) INSERT INTO DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, 0)]
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:430)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:87)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:159)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:139)
    at liquibase.lockservice.StandardLockService.init(StandardLockService.java:128)
    at liquibase.Liquibase.checkLiquibaseTables(Liquibase.java:1176)
    at liquibase.Liquibase.listLocks(Liquibase.java:1193)
    at com.blah.utils.LiquibaseMigrator.dbLocksExist(LiquibaseMigrator.java:xxx)
    at com.blah.utils.LiquibaseMigratorExecutor.dbLocksExist(LiquibaseMigratorExecutor.java:xxx)
    at com.blah.MyApp.migrateDatabase(MyApp.java:xxx)
    at com.blah.MyApp.run(MyApp.java:xxx)
    at com.blah.MyApp.run(MyApp.java:xxx)
    at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:59)
    at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:98)
    at io.dropwizard.cli.Cli.run(Cli.java:78)
    at io.dropwizard.Application.run(Application.java:94)
    at com.blah.MyApp.main(MyApp.java:xxx)
Caused by: java.sql.SQLException: ORA-12838: cannot read/modify an object after modifying it in parallel

服务将抛出该异常,然后pod将重新启动并重复。我手动将该行添加到它试图插入的锁表中,然后下一次启动成功。

当时只有1个pod在运行,所以我不认为它与我发现的启动错误的种族条件有关,但我不知道为什么/如何它会进入这个无法读取/在并行状态下修改对象后修改它。

共有1个答案

宣星光
2023-03-14

确保您正在连接到不使用并行DML的LOW服务

 类似资料:
  • null 但它们在和上抛出了一个SQLGrammerException。 我无法获得行锁,因为行还不存在。或者,如果它确实存在,我不会更新任何东西,我只会不插入任何东西,而转移到其他东西。 还有其他情况,我希望用相同的事务id保存多个记录,所以我不能仅仅使列唯一并try/catch保存。 下面是模型的一些内容: 下面是调用的服务方法的一般思想。 我要防止的是对的两个几乎同时的调用导致数据库中的重复

  • 我在Tomcat7上部署了我的应用程序。它连接到后端的MySql数据库。其中有DATABASECHANGELOG,它的锁和用户表配置在“core”模式中。在启动tomcat服务器时,我面临以下问题。 即使在启动服务器之前删除所有与DATABASECHANGELOG相关的表,我也面临着同样的问题。 我在Liquibase锁中没有找到任何解决这个问题的方法--原因?

  • test1 a=new test 1(3,“b”);

  • 主要内容:Oracle CREATE TABLE语句简介,Oracle CREATE TABLE示例在本教程中,您将学习如何使用Oracle 语句在Oracle数据库中创建一个新表。 Oracle CREATE TABLE语句简介 要在Oracle数据库中创建一个新表,可以使用语句。下面说明了语句的基本语法: 在上面这个语法中, 首先,在子句中,指定新表所属的表名和模式名称。 其次,在圆括号内列出所有列。 如果一个表有多个列,则需要用逗号分隔每个列的定义。列定义包括列名,后跟它的数据类型,例如,

  • 连接到:Oracle Database 11g Enterprise Edition版本11.2.0.1.0-64bit产品,具有分区、OLAP、数据挖掘和实际应用程序测试选项

  • 问题内容: 我想在Oracle数据库中创建一个临时表 就像是 在SQL Server中 然后用选择语句填充它 是否有可能? 谢谢 问题答案: 是的,Oracle有临时表。这是描述它们的AskTom文章的链接,这是oracle的官方CREATE TABLE文档。 但是,在Oracle中,只有临时表中的 数据 是临时的。该表是其他会话可见的常规对象。在Oracle中频繁创建和删除临时表是一种不好的做法