我有一个使用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); 这将在该事务的持续时间内仅锁定该表以进行选择/插入.
希望它有所帮助
使事务的隔离级别为SERIALIZABLE(session.BeginTransaction(IsolationLevel.Serializable
),并在同一事务中检查并插入.在这种情况下,您通常不应将isolationlevel设置为可序列化.
要么
在检查并最终插入之前锁定表.您可以通过nhibernate触发SQL查询来执行此操作:
session.CreateSQLQuery("SELECT null as dummy FROM Booking WITH(tablockx,holdlock)").AddScalar("dummy",NHibernateUtil.Int32); 这将在该事务的持续时间内仅锁定该表以进行选择/插入.
希望它有所帮助