小编典典

NHibernate交易和竞争条件

sql

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

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

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

booking_ref(INT)PRIMARY_KEY AUTOINCREMENT

booking_start(DATETIME)

booking_end(DATETIME)


阅读 178

收藏
2021-04-22

共1个答案

小编典典

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

或者

  • 在检查并最终插入之前锁定表。您可以通过nhibernate触发SQL查询来做到这一点:

session.CreateSQLQuery(“选择null作为来自预订WITH(tablockx,holdlock)的虚拟对象”).AddScalar(“
dummy”,NHibernateUtil.Int32); 这将仅锁定该表以在该事务期间进行选择/插入。

希望能有所帮助

2021-04-22