当前位置:  开发笔记 > 编程语言 > 正文

NHibernate交易和竞争条件

如何解决《NHibernate交易和竞争条件》经验,为你挑选了1个好方法。

我有一个使用NHibernate的ASP.NET应用程序,在用户操作时以事务方式更新几个表.涉及日期范围,只能在表"预订"中输入一个条目,以便指定独占日期.

我的问题是如何防止竞争条件,即两个用户动作几乎同时发生,并导致多个条目进入"预订"> 1日期.在调用.Commit()之前我无法检查,因为我认为仍会留下竞争条件?

所有我能看到的是在提交后进行检查并手动滚动更改,但这让我的嘴巴味道很糟糕!:)

booking_ref(INT)PRIMARY_KEY AUTOINCREMENT

booking_start(DATETIME)

booking_end(DATETIME)

小智.. 5

使事务的隔离级别为SERIALIZABLE(session.BeginTransaction(IsolationLevel.Serializable),并在同一事务中检查并插入.在这种情况下,您通常不应将isolationlevel设置为可序列化.

要么

在检查并最终插入之前锁定表.您可以通过nhibernate触发SQL查询来执行此操作:

session.CreateSQLQuery("SELECT null as dummy FROM Booking WITH(tablockx,holdlock)").AddScalar("dummy",NHibernateUtil.Int32); 这将在该事务的持续时间内仅锁定该表以进行选择/插入.

希望它有所帮助



1> 小智..:

使事务的隔离级别为SERIALIZABLE(session.BeginTransaction(IsolationLevel.Serializable),并在同一事务中检查并插入.在这种情况下,您通常不应将isolationlevel设置为可序列化.

要么

在检查并最终插入之前锁定表.您可以通过nhibernate触发SQL查询来执行此操作:

session.CreateSQLQuery("SELECT null as dummy FROM Booking WITH(tablockx,holdlock)").AddScalar("dummy",NHibernateUtil.Int32); 这将在该事务的持续时间内仅锁定该表以进行选择/插入.

希望它有所帮助

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有