【问题标题】:Is selectKey thread safe in MyBatis?MyBatis 中的 selectKey 线程安全吗?
【发布时间】:2014-11-21 19:58:56
【问题描述】:

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

<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>

如果多个线程在不同的会话中运行,一个线程是否有可能获得由其他会话递增的序列值?

换句话说,MyBatis 是否允许/阻止位于某个&lt;insert&gt; 标记中的INSERT INTO&lt;selectKey&gt; 语句之间的另一个INSERT INTO 语句?

关于 PostgreSQL here 有一个类似的问题。但是,由于所有会话都共享 Oracle 序列,因此我不能相信数据库会给我当前会话中最后插入的值。

【问题讨论】:

    标签: java multithreading oracle mybatis


    【解决方案1】:

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

    即使 mybatis 将执行两个语句(选择和插入)都按照您的意愿进行原子化,这也无济于事,因为第二个并发事务仍然会看到相同的值。您需要自己处理并发问题。

    【讨论】:

    • 感谢您的解释:)
    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 2018-07-18
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    • 2021-08-03
    相关资源
    最近更新 更多