【问题标题】:mybatis - insert transactionmybatis - 插入事务
【发布时间】:2014-07-27 03:11:36
【问题描述】:

用于插入的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() 函数在当前会话的上下文中运行,而不是全局会话,但我不确定。

【问题讨论】:

    标签: java sql mybatis


    【解决方案1】:

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

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

    所以你会得到正确的值。在另一种方式中,序列是非事务性的。每个会话都获得一个不同的序列值。序列中的更改无法撤消。

    【讨论】:

    • 谢谢,这就是我想知道的 :) 我应该更仔细地检查文档。
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2016-01-28
    • 2019-04-22
    相关资源
    最近更新 更多