NHibernate交易和竞争条件

时间:2020-03-06 14:35:10  来源:igfitidea点击:

我有一个使用NHibernate的ASP.NET应用程序,可以根据用户操作以事务方式更新一些表。其中涉及一个日期范围,因此只能对表" Booking"进行一次输入,从而指定独占日期。

我的问题是如何防止出现竞争状况,即两个用户动作几乎同时发生,并导致多个项输入"预订"超过1个日期。我无法在调用.Commit()之前进行检查,因为我认为仍然会出现竞争状况吗?

我所能看到的只是在提交后进行检查,然后手动将更改回滚,但这使我的口中很难受! :)

booking_ref (INT) PRIMARY_KEY AUTOINCREMENT
  
  booking_start (DATETIME)
  
  booking_end (DATETIME)

解决方案

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

或者

  • 在检查并最终插入之前锁定表。我们可以通过nhibernate触发SQL查询来做到这一点:session.CreateSQLQuery(" SELECT null as dummy from Booking WITH(tablockx,holdlock)")。AddScalar(" dummy",NHibernateUtil.Int32);这将仅锁定该表以在该事务期间进行选择/插入。

希望能有所帮助