我有一个在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会在当前会话中为我提供最后插入的值。
答案 0 :(得分:0)
简短的回答是mybatis在这种情况下没有做任何隐式锁定。
即使mybatis会像你想要的那样执行两个语句(select和insert)原子,这也无济于事,因为第二个并发事务仍会看到相同的值。你需要自己照顾并发。