- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 ASP.NET 页面中使用以下代码来创建记录,然后对记录进行计数以确保没有超出设定的限制,如果超出则回滚事务。
using (var session = NhibernateHelper.OpenSession())
using (var transaction = session.BeginTransaction())
{
session.Lock(mall, LockMode.None);
var voucher = new Voucher();
voucher.FirstName = firstName ?? string.Empty;
voucher.LastName = lastName ?? string.Empty;
voucher.Address = address ?? string.Empty;
voucher.Address2 = address2 ?? string.Empty;
voucher.City = city ?? string.Empty;
voucher.State = state ?? string.Empty;
voucher.Zip = zip ?? string.Empty;
voucher.Email = email ?? string.Empty;
voucher.Mall = mall;
session.Save(voucher);
var issued = session.CreateCriteria<Voucher>()
.Add(Restrictions.Eq("Mall", mall))
.SetProjection(Projections.Count("ID"))
.UniqueResult<int>();
if (issued >= mall.TotalVouchers)
{
transaction.Rollback();
throw new VoucherLimitException();
}
transaction.Commit();
return voucher;
}
但是,我遇到了很多僵局。我认为发生这种情况是因为我试图对刚刚执行插入的表中的记录进行计数,并且插入的行上仍然持有锁,从而导致死锁。
我尝试在最终查询中调用 SetLockMode(LockMode.None),但这会导致我无法弄清楚的 NullReferenceException。
编辑:如果我在保存对象之前运行查询,它会起作用,但随后我无法实现验证我的插入未以某种方式超出限制的目标(在并发插入的情况下)。
编辑:我发现在 session.BeginTransaction 调用中使用 IsolationLevel.ReadUncommited 可以解决问题,但我不是数据库专家。这是问题的适当解决方案还是我应该如何调整我的逻辑?
最佳答案
这种设计很容易出现死锁 - 通常(并非总是)一个连接本身不太可能发生死锁,但对同一个表进行插入和聚合的多个连接很可能发生死锁。这是因为,虽然从执行工作的连接的角度来看,一个事务中的所有事件看起来都是完整的 - 数据库不会将事务锁定在“其自己的”记录之外 - 来自其他事务的聚合查询将尝试锁定同时处理整个表或其中的大部分,这会导致死锁。
在这种情况下,读取未提交不是你的 friend ,因为它基本上表示“忽略锁定”,这在某些时候意味着违反你围绕数据设置的规则。 IE。表中的记录计数将不准确,您将根据该不准确的计数采取行动。当真实答案是 11 时,您的计数将返回 10 或 13。
我最好的建议是重新安排插入逻辑,以便捕获计数的想法,而不是逐字计算行数。你可以走几个方向。我的一个想法是:用一个序列对插入的凭证进行逐字编号,并对序列本身施加限制。
Begin TransactionSanity check the nextVoucher for Mall in the sequence table; if too many exist abortIf less than MaxVouchers for Mall then { check, fetch, lock and increment nextVoucher if increment was successful then use the value of nextVoucher to perform your insert. Include it in the target table.}Error? RollbackNo Error? Commit
像这样的序列表会损害一些并发性,但我认为不如不断计算表中的行那么严重。请务必进行性能测试。此外,[检查、获取、锁定和增量]也很重要 - 您必须独占锁定序列表中的行,以防止其他连接在增量之前瞬间使用相同的值。我知道这方面的 SQL 语法,但恐怕我不是 nHibernate 专家。
对于读取未提交数据错误,请检查:http://sqlblog.com/blogs/merrill_aldrich/archive/2009/07/29/transaction-isolation-dirty-reads-deadlocks-demo.aspx (免责声明:Merrill Aldrich 就是我:-)
关于asp.net - 休眠死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1229617/
这个问题在这里已经有了答案: What is the JavaScript version of sleep()? (91 个回答) 关闭 9 年前。 是的,我知道 - 这个问题有成千上万的答案。请
有没有办法使用 native NHibernate linq 提供程序执行以下查询? var result = (from e1 in Session.Query() join e2
上下文:我正在尝试将Grails项目从1.0.3升级到1.3.7,并且遇到了很多问题。我刚得到很多DuplicateMappingExceptions,因为该项目同时具有Hibernate XML文件
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我正在寻找一种重新启动线程的方法,无论是从该线程的上下文内部还是从线程外部,可能是从另一个进程中。 (这些选项中的任何一个都可以。)我知道使整个进程休眠的困难,而且我很确定线程也会遇到同样的困难。但是
C 中是否有任何函数可以检查计算机是否进入 sleep 、休眠 或锁定 并从这些状态唤醒? 在msdn它们为 C#、C++ 提供,但不为 C 提供。我的操作系统是windows7 如下是我用来检查启动
我对 NHibenate 有疑问。当我运行 queryover 时,出现错误“无法解析属性:User.Name of:MegaOnlineChat.Core.Entities.Message”。我做错
我知道这里被问过很多次,也回答过很多次,这不是应该如何完成的方式,但再一次:) 是否有可能以某种方式调用异步函数(例如计时器/ajax 调用),基本上是常见的异步任务并同步等待直到它结束而不会出现 1
我在persistence.xml中有以下内容 com.merc.model.log.EventLogging org.hibernate.ejb.HibernatePersiste
目前我的存储库有 2 个构造函数。当我从我的 mvc 网站调用这些时,我总是调用第一个构造函数,从而打开一个新 session 。我应该在 session 中通过吗?我该怎么做。 public
hibernate session to list conversion Compilation Error occured when java converted into scala..!!
下面的remove()方法导致“超出了GC开销限制”。从A或B或C中删除ABC中存在的关联时。请您告知错误在哪里吗? 注-ABC是A,B,C的映射表 stacktrace如下: Caused by:
昨天我在 webhosting.net 的 Jelastic v2.2.2 上获得了一个试用帐户,并配置了一个最少 0 个 cloudlets 的环境(最多 8 个,即全部动态,无保留)。然后我部署了
设置:Grails 2.5.6和Hibernate 4.3.10 我有一个带有字符串ID的表。事实是,它的值是数字字符串,当我传入诸如get()这样的值时,这似乎使"000000"变得混乱。 域类:
hibernate session to list conversion Compilation Error occured when java converted into scala..!!
我有一个用于 PDA 的应用程序,它有一个长时间运行的进程,我遇到了一个问题,即 PDA 将在该进程完成之前进入休眠状态。 我无法控制 PDA 上的电源设置,有谁知道我的应用程序阻止 PDA 进入休眠
我正在创建一个将安装在 LaunchAgents 文件夹中的守护程序。关于使其 sleep 的一些问题: 因为它是一个 LaunchAgent 项,所以可执行文件会在用户/系统 sleep 时自动 s
我想使用 AsyncTask 创建启动画面。具体来说,在 doInBackground() 方法中,我使用静态方法 Thread.sleep() 并在它创建一个将应用程序重定向到其他 Activity
在我的网站上,我有一个 JavaScript 函数,它执行 AJAX 调用来获取帐户信息,然后打开一个模式,您可以在其中查看和编辑信息。 AJAX 调用用于更改您选择的数据库中的详细信息,然后刷新原始
除非线程告诉我醒来,否则我想睡 X 时间。在下面的示例中,我想休眠 10 毫秒(1/100 秒)或直到 foo 有 2000 个项目。以先到者为准。我该怎么做呢?我编了函数 主线程: pthread_
我是一名优秀的程序员,十分优秀!