【问题标题】:mybatis+oracle, program stuck on insertionmybatis+oracle,程序卡在插入
【发布时间】:2019-04-22 12:44:02
【问题描述】:

我正在用 Java 和 myBatis 编写一个程序。程序被以下插入卡住而没有错误消息。我检查了Oracle,没有插入任何数据。我不知道为什么会这样。通常 sql 或 myBatis 都会出现某种错误。

id type     number(10)
id_card_no  varchar2(50)
gene_info   varchar2(2000)

如果需要更多信息,请尽管询问。谢谢!

<insert id="addGenotype" parameterType="genotype" useGeneratedKeys="false" >
        insert into person_genotype (ID,ID_CARD_NO,GENE_INFO)
    <foreach collection="list" item="genotype" index="index" separator="UNION ALL">
        (select
        #{genotype.genotypeId},#{genotype.idCardNumber},#{genotype.geneInfo}
        FROM DUAL)
    </foreach>
</insert>

【问题讨论】:

  • 你为什么使用foreachSELECT FROM DUAL
  • @EvgeniEnchev 最初我使用值而不是 select from dual,逗号而不是 union all 作为分隔符,但我发现它适用于 mysql 但不适用于 oracle。我从另一个帖子中学到了这种方法。
  • 语法将被插入到 table(...) (select ... from dual) union all (select ... from dual)

标签: java sql oracle optimization mybatis


【解决方案1】:

很可能有另一个数据库会话插入了具有相同主键但尚未提交的行。让SQL*Plus 运行并进行一些未提交的更改是一种相当常见的情况。

在 Oracle 中,如果两个并发事务插入到同一个表中,则其中一个在某个唯一键上发生冲突的行将阻塞,直到另一个提交或回滚。

解决此问题的方法之一是使用序列自动为行生成标识符。在这种情况下,每条新记录都会获得自己全新的唯一 ID。

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多