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

selectKey线程在MyBatis中是否安全?

东郭弘方
2023-03-14

我有一个在Oracle 11g DB上运行的insert语句,如下所示:

<insert id="insertSelective" parameterType="myObj">
    <selectKey keyProperty="seq_id" order="AFTER" resultType="Long">
        SELECT mySeq.currval FROM dual
    </selectKey>        
    INSERT INTO myTable
    <include refid="myValues"/>
</insert>

这里有一个处理PostgreSQL的类似问题。但是,由于Oracle序列由所有会话共享,所以我不能相信DB会给出当前会话中最后插入的值。

共有1个答案

慕容康安
2023-03-14

简单的回答是mybatis在这种情况下不做任何隐式锁定。

即使mybatis将两个语句(select和insert)的执行按您的要求是原子的,这也没有多大帮助,因为第二个并发事务仍然会看到相同的值。您需要自己关心并发性。

 类似资料:
  • 问题内容: 我一直在假设线程安全也不是线程安全,但是在最近的一次讨论中,一位同事告诉我线程安全。 因此,我做了一些研究,却一无所获。很多人认为它是线程安全的,很多人认为它不是线程安全的。而且,最重要的是,文档没有以一种或另一种方式说任何话,不是为了,甚至不是。 那是什么呢? 问题答案: 这是指向Java 7 中Calendar和GregorianCalendar的源代码的链接。 如果阅读该代码,您

  • 问题内容: 我知道文档说明该对象是线程安全的,但这是否意味着从所有方法对其进行的所有访问都是线程安全的?因此,如果我一次从多个线程中调用它,并且一次在同一实例上调用它,会不会发生什么不好的事情? 问题答案: 快速答案是肯定的,它们是线程安全的。但是不要让它在那里… 首先,一个小的内部管理是一个接口,任何不是线程安全的实现都将破坏书面合同。您包括的链接是指,它具有一定的灵巧性。 您包含的链接引起了一

  • 我在mybatis中使用了下面的插入查询。在ibatis中,相同的查询seq_consumer_id.nextval返回到java中的调用方法,并将其插入到consumer_id列中。但是在mybatis中,方法的返回值始终为1(我假设它是插入行的编号),尽管consumer_id列是从序列中正确更新的。我们不能生成密钥,插入它并将其返回到mybatis中的java类吗?

  • null 有些问题似乎是这样说的: 如何为多个用户隔离Jetty HttpClient?

  • 有一次,我被印上了“祝贺”,有一次,我被印上了“站台”。

  • 问题内容: 我有多个线程试图更新MySQL数据库?使用executeUpdate方法是线程安全的吗? 问题答案: 不,使用它不是线程安全的。 实际上,如果其他某个线程使用一条语句,然后另一个线程调用executeUpdate(),则另一个线程的s(如果有的话)将被关闭。“ javadoc.sql.Statement的JavaDoc(PreparedStatement是其子类型) ”如果存在打开的语