mybatis - 插入事务

时间:2014-07-27 03:11:37

标签: java sql mybatis

插入的mybatis映射器代码:

<insert id="insert" parameterType="Shop" useGeneratedKeys="true">
    insert into shop(email, pswd, nickname, mobile, city, create_date, status) values (#{email}, #{pswd}, #{nickname}, #{mobile}, #{city}, #{createDate}, #{status})
    <selectKey keyProperty="id" order="AFTER" resultType="long">
        select currval('shop_id_seq')
    </selectKey>
</insert>

数据库是postgresql 9.3。

我的怀疑是:没有明确的事务,当我从select currval('shop_id_seq')的序列中检索id时,如果其他线程也在执行插入,是否可能得到错误的值?

我认为它不会,因为currval()函数在当前会话的上下文中运行,而不是全局会话,但我不确定。

1 个答案:

答案 0 :(得分:0)

根据PostgreSQL: Documentation: 9.3: Sequence Manipulation Functions,序列函数currval

  

当前会话中返回nextval最近获得的此序列的值。 (如果在此会话中从未为此序列调用nextval,则会报告错误。)因为这会返回会话本地值,所以它会提供可预测的答案自当前会话以来其他会话是否已执行nextval

所以你会得到正确的价值。换句话说,序列是非事务性的。每个会话都获得一个不同的序列值。序列的变化无法撤消。