MyBatis中的selectKey线程是否安全?

时间:2014-11-21 11:43:18

标签: java multithreading oracle mybatis

我有一个在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是否允许/阻止位于某个INSERT INTO代码中的INSERT INTO<selectKey>语句之间的另一个<insert>语句?

有一个类似的问题涉及PostgreSQL here。但是,由于Oracle序列由所有会话共享,我不能相信DB会在当前会话中为我提供最后插入的值。

1 个答案:

答案 0 :(得分:0)

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

即使mybatis会像你想要的那样执行两个语句(select和insert)原子,这也无济于事,因为第二个并发事务仍会看到相同的值。你需要自己照顾并发。