2014-11-21 144 views
0

我有一個INSERT語句進行如下的上的Oracle 11g數據庫上運行:MyBatis中的selectKey線程是否安全?

<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>標記中的INSERT INTO<selectKey>語句之間的另一個INSERT INTO語句?

還有一個類似的問題處理PostgreSQL here。但是,由於Oracle序列由所有會話共享,所以我不能相信數據庫會給我在當前會話中插入的最後一個值。

回答

0

簡短的回答是mybatis在這種情況下不會做任何隱式鎖定。

即使mybatis會按照您希望的方式執行兩條語句(select和insert)atomic,但這並不會有多大幫助,因爲第二個併發事務仍然會看到相同的值。你需要注意自己的併發性。

+0

感謝您的解釋:) – yalpertem 2014-11-21 12:39:04