在spring+ibatis中使用LAST_INSERT_ID()是否安全?

still_waiting 2013-08-05 10:16:02
项目数据库要从oracle转为mysql。

为了获取插入数据的id,oracle中有sequence ,对mysql不是很熟悉,google得知一般都用自增字段去实现。

ibatis中这样写的:


<insert id="insertIssue" parameterClass="Issue">
insert into issue (name,issue_user,status)
values (#name#,#issueUser#,#status#)
<selectKey resultClass="int" keyProperty="id">
SELECT LAST_INSERT_ID() AS ID
</selectKey>
</insert>


关于LAST_INSERT_ID() 看到文档提到是:

“产生的ID 每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的 AUTO_INCREMENT值。这个行为保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁或处理。”

请问大家这种方法在高并发状态下是否安全?

或者有没有其他好的方式模拟sequence ?

非常感谢!
...全文
415 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oRachel1 2015-10-21
  • 打赏
  • 举报
回复
这种方案有测试过高并发吗,如何测试的,求指教
LSXCYJ 2015-04-09
  • 打赏
  • 举报
回复
April_CH 2013-08-06
  • 打赏
  • 举报
回复
#3 说的好
小丑哥_V5 2013-08-06
  • 打赏
  • 举报
回复
still_waiting 2013-08-06
  • 打赏
  • 举报
回复
引用 3 楼 aiqinbird 的回复:
我理解你的意思了,你是想在高并发时,插入数据想返回当前所插入记录的ID,是吧? 这个应该不会的,LAST_INSERT_ID是基于单个数据库连接的,它会返回的ID是当前连 接最后一次insert操作的ID,并不是整个数据库最后一次insert操作。
恩 谢谢~是这个意思 基于连接池的应该也是安全的。
gqchen1981 2013-08-05
  • 打赏
  • 举报
回复
我理解你的意思了,你是想在高并发时,插入数据想返回当前所插入记录的ID,是吧? 这个应该不会的,LAST_INSERT_ID是基于单个数据库连接的,它会返回的ID是当前连 接最后一次insert操作的ID,并不是整个数据库最后一次insert操作。
still_waiting 2013-08-05
  • 打赏
  • 举报
回复
引用 1 楼 aiqinbird 的回复:
mysql不是有自增长字段吗? 字段属性:Auto Incr什么的。 设置主键自增长,然后IBATIS里我是这样写的: <selectKey resultClass="Long" keyProperty="seqid"> SELECT @@IDENTITY AS seqid </selectKey>
是的,ID是用自增字段了, 问题是,我在想insert之后然后select LAST_INSERT_ID()会不会被其他insert污染?
gqchen1981 2013-08-05
  • 打赏
  • 举报
回复
mysql不是有自增长字段吗? 字段属性:Auto Incr什么的。 设置主键自增长,然后IBATIS里我是这样写的: <selectKey resultClass="Long" keyProperty="seqid"> SELECT @@IDENTITY AS seqid </selectKey>

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧