![]() |
1
7
HQLDML查询将在不需要锁的情况下完成更新。 这在NHibernate 2.1中可用,但在参考文件中还没有。爪哇 hibernate documentation 非常接近NHibernate的实现。 假设您使用的是readcommitted隔离,那么就可以在事务内部安全地读取您的值。
根据表名和列名,生成的SQL将是:
|
![]() |
2
3
我怀疑它可以从NHiberinate做。就个人而言,我将使用存储过程来完成您要完成的工作。 更新: 考虑到持续下降的票数,我将进一步讨论这个问题。Frederick正在从他的ORM层询问如何使用锁定提示,这些提示是语法和底层数据库引擎的具体实现细节。这是尝试执行此类操作的错误级别-即使可能(但不可能),它在所有受NHibernate支持的数据库中持续工作的可能性也非常低。 很好,弗雷德里克的最终解决方案不需要先发制人的专用锁(这会破坏性能,通常是个坏主意,除非你知道你在做什么),但我的回答是有效的。任何遇到此问题并希望对从nhibernate读取进行独占锁定的人-首先:不要这样做,其次:如果必须这样做,请使用存储过程或sqlquery。 |
![]() |
3
1
如果您所读的全部内容都是用可序列化的isolationlevel完成的,并且所有的写入操作都是用可序列化的isolationlevel完成的,那么我不明白为什么您需要自己对数据库行进行任何锁定。 所以序列化可以保证数据的安全,现在我们仍然有可能出现死锁的问题…… 如果死锁不是常见的,那么在获得死锁时将[开始事务、读取、更新、保存]放在重试循环中就足够了。 否则,可以使用直接生成的用于更新的简单__select语句(例如,不与nhibernate一起生成)来停止另一个事务在更改行之前读取该行。 不过,我一直在想,如果更新速度足够快,导致出现很多死锁,那么ORM可能不是更新的正确工具,或者数据库模式可能需要重新设计,以避免必须读/写的值(例如,在读取数据时计算它)。 |
![]() |
4
0
如果要确保从数据库中读取的值在事务期间不会更改,可以使用隔离级别“可重复读取”。但在所有关键事务中都必须这样做。或者使用升级锁将其锁定在关键读取事务中。 |
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 3 年前 |
![]() |
JohnLBevan · 为什么原子语句上需要锁提示? 7 年前 |
![]() |
Jay Wang · 生产者/消费者实施:陷入消费者循环 7 年前 |
![]() |
Andremoniy · 悲观写入是否锁定整个表? 7 年前 |
![]() |
Marcus Cemes · 选择。。。用于更新在提交后选择旧数据 7 年前 |
![]() |
Ins0maniac · Rails,锁定数据库中的记录 7 年前 |