我在仓库项目中使用Castle ActiveRecord。我有几个频繁更新的表:馈源,堆栈,堆栈位置。如果发生了很多事情(添加馈源,堆栈形成),有时在调用CreateAndFlush之后在对象上设置的ID是来自另一个表的ID。数据库是MySQL,ID列是int(11)不为空的auto_increment主键。我使用PrimaryKeyType.Native作为ID属性。Castle ActiveRecord从CreateAndFlush上的错误表中返回ID
我也遭受了以下问题: How to retrieve the last insert ID in Castle ActiveRecord? 但只有我的喂食表(我通常有像4堆/饲料)。之后我用5000ms睡眠和SaveAndFlush添加了一个捕获情况,这确保了我在那个时候获得了一个ID。
我需要直接调用flush,因为我需要该ID将其写入PLC,稍后将它传递给我。我的应用程序是多线程的,但是如果我是正确的,那么只有一个线程在所有这些出错的情况下写入数据库。我没有任何标记为易失性的东西,没有锁定来阻止来自多个线程的数据库访问,但我认为Castle ActiveRecord确实锁定了合适的地方。
我不想回答我自己的问题,但似乎我发现我做的都是错的。显然,nHibernate有意不是线程感知的。因此,我需要关注在不同线程中使用的nHibernate会话。使用Castle ActiveRecord,解决方案似乎是在线程中使用'(新的SessionScope())'块来迎合这个问题。如果有人有更好的建议或更明确的解释,我显然很感兴趣。 – mycroes
你可以回答你自己的问题,并在几天后接受它。 –