【问题标题】:Is LAST_INSERT_ID() in a transaction dependable?事务中的 LAST_INSERT_ID() 是否可靠?
【发布时间】:2011-09-15 17:01:12
【问题描述】:

我正在使用 mysql/ado.net/C# 这是我的问题 我知道 mysql 是并发的,但是我有文件数据(缩略图名称)和 db 数据(行)要同步。

如果我开始交易但由于任何原因失败,这会是一个问题吗?如果我让这段代码在两个核心上同时运行,它们会互相破坏吗?我基本上需要知道 1) last_insert_id 是否可靠而不改变。 2) 如果一个事务使用所述rowid,则另一个事务不会使用它。

start transaction
insert statement, however i dont want it to be active yet;
select LAST_INSERT_ID()
File.Delete(lastid)//may exist from a transaction that failed
File.Move(thumbImage, lastid)
transaction.commit()//ok done

这样安全吗?为什么或为什么不?

【问题讨论】:

  • 您确实意识到您的文件系统没有事务的概念,因此回滚事务将不会撤消文件系统中的更改,不要你?据我所知,虽然 File.Delete 或 File.Move 中的异常会导致事务回滚,但 File.Move 中的异常将不会撤消 File.Delete。
  • @veggen:我根本不需要我要删除的文件。事实上,我说它可能不存在,如果它存在,它就失败了。我不记得 thumbImage 是生成的还是原始的,但我想我检查它是否存在,如果它存在,我知道它已“完成”并删除工作事务(如果我以某种方式搞砸了,那么它仍然会删除哪个没关系,因为这将是一个不可恢复的错误,但这个作业队列没有失败,对我来说看起来很可靠)

标签: .net mysql ado.net concurrency thread-safety


【解决方案1】:

MySQL 的 last_insert_id() 是可靠的,因为它始终是特定连接执行的最后插入。它不会报告由其他连接创建的插入 id,也不会报告您在两个连接之前执行的插入。实际插入发生在哪个 cpu 核心上以及处理 last_insert_id() 调用的核心都无关紧要。它始终是该连接的正确 ID 号。

如果您回滚执行插入的事务,last_insert_id() 仍会报告该新 id,即使它不再存在。但是,在随后的插入中,该 ID 不会被重用

【讨论】:

  • 正是我需要知道的“由特定连接执行的最后插入”。
  • 显然带走了我对这个有用功能的所有好奇和担忧
  • 如果我在存储过程中插入,这个函数是否保证给我我刚刚插入该过程的 id。我假设因为它是一个原子事务,所以答案是肯定的,但需要确认。
猜你喜欢
  • 2014-04-03
  • 2011-02-27
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多