日期:2014-05-17  浏览次数:20404 次

紧急求救:事务死锁问题。
提示:事各(进程 ID 72)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲器。请重新运行该事务。

这是一个考试系统,四十个人一起考试,进入正式考试时出现这错误;

进入正式考试时会随机生成试卷并保存至数据库中,一个学生的试卷约有650条记录(不是学校的那种考试),分三级三个表(试卷总表,题目表,题目明细表)存放。
往数据库中插入数据时会使用事务。

四十个人一起考,约有十来个人会出现以上错误,请高手帮忙分析分析,该如何解决。
在单机上产生试卷并保存所耗的时间约为一秒。

------解决方案--------------------
谁知道你是如何编写程序的?只能胡乱瞎猜。

随便说。首先,你应该不要纠结在技术上。

其次,能不能让这些人的出题时间错开一点?至少在同一秒(或者5秒钟内)出题人数不要超过5个人,例如你可以先给5个人出题,然后等着5个人全都出完题目,才给另外5个人出题......。

注意,程序设计可不是什么关系数据库,而是“程序”设计。关系数据库只不过是个程序运行过程的存储而已,应该以不影响程序运行效率为原则。那些满脑子只有数据库表的人还没有长大。

再次,你也可以在出题之前先复制到内存里,然后给每一个人出题时都是在内存副本上出题(而不读写什么数据库表)。出完题之后才把很简练的结果非常轻快地写到数据库。
------解决方案--------------------
http://www.cnblogs.com/happyhippy/archive/2008/11/14/1333922.html
http://hi.baidu.com/qiandeqiande/item/2ec5d69e4446ec1a934f4157
http://database.51cto.com/art/201001/179089.htm

------解决方案--------------------
引用:
其次,能不能让这些人的出题时间错开一点?

这点是通过程序控制还是叫考试不要同一时间进入?
如果程序控制,那么多学生,后面的不是一直在等待,那不会超时吗?

忘了说了,我开发的是B/S程序,每个人每次进去时试卷都是不一样的,所以,在内存中生成副本这种不行吧。

B/S的话在WEB SERVER对生成试卷的动作加锁,保证一次只有一个人在生成试卷