sqlserver:事务(进程 ID 82)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务

又来了吧 2013-09-22 05:30:21
下面是源码和存储过程,求大神指点

public int saveRecvToDB(DeliverMessage[] moMsg) {
int count = 0;
C3P0 c3p0=C3P0.getInstance();
Connection conn =c3p0.getConnection();
if (conn == null) {
return count;
}
CallableStatement cStmt = null;

try {
conn.setAutoCommit(false);
cStmt = conn.prepareCall("{ call "
+ AppConfig.getWriteRecvProcedure() + "(?,?,?,?,?,?) }");

for (int i = 0; i < moMsg.length; i++) {
if(moMsg[i] == null)
continue;
if(moMsg[i].CONTENT_TYPE==2){
if(moMsg[i].ECODE==0){
moMsg[i].ECODE=0;
}else if(moMsg[i].ECODE==1||moMsg[i].ECODE==20||moMsg[i].ECODE==24
||moMsg[i].ECODE==29){
moMsg[i].ECODE=2;
}else{
moMsg[i].ECODE=1;
}
}

cStmt.setString(1, moMsg[i].SRCMOBILE);
cStmt.setInt(2, moMsg[i].CONTENT_TYPE);
cStmt.setString(3, moMsg[i].CONTENT);
cStmt.setString(4, moMsg[i].SENDID);
cStmt.setInt(5, moMsg[i].ECODE);
cStmt.setString(6, AppConfig.getIdentity()+moMsg[i].LONGID);
cStmt.addBatch();
count++;
}
cStmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
AppLoger.info("[CMPP-GW DBOperator]Exception Save mo Failed!!!"
+ e.getMessage());
try {
conn.rollback();
} catch (SQLException e1) {
}
return 0;
} finally {
close(null, cStmt);
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}
}

return count;
}


存储过程:
PROCEDURE [dbo].[qdpolice_writeRecv] 
@phone varchar(12),
@contentType int, --上行0内容,4状态报告
@msg varchar(500),
@sendID varchar(50),
@status int,--ecode
@longid varchar(20)

AS

BEGIN
SET NOCOUNT ON;

if @contentType = 0
begin
insert into MODB
(REVETIME
,MSGCONTENT
,PHONE
,SpNUMBER)
values
(getdate()
,@msg
,@phone
,@longid);
end
else

begin
insert into ReportStatusDB
(MSGID
,PHONE
,MSGSTATUS)
values
(@sendID
,@phone
,@status);
end

--select @v_guid
END
...全文
2328 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2013-10-11
  • 打赏
  • 举报
回复
从存储过程的代码看,应该只是死锁其中一个进程的,应该还有另一个进程的. 建议开启1024,1222跟踪标记,会自动记录死锁信息在SQL日志,以利死锁分析.
發糞塗牆 2013-10-11
  • 打赏
  • 举报
回复
用profiler把死锁图截出来看看
LongRui888 2013-10-11
  • 打赏
  • 举报
回复
现在的关键问题是要知道这个会话82和另一个会话,这个会话运行的是什么代码,这个必须通过监控来知道, 可通过sql profiler的Lock事件的 Deadlock Graph,这样就可以跟踪是哪个语句和这个存储过程发生死锁的,这样就可以防止死锁了
Q315054403 2013-09-22
  • 打赏
  • 举报
回复
死锁只能从设计上解决,对一些情况,如果将性能优化好也能极大减少出现的可能
Andy__Huang 2013-09-22
  • 打赏
  • 举报
回复
你在存储过程里面加事务吧,你没有事务就有可能存在争夺资源而死锁
--小F-- 2013-09-22
  • 打赏
  • 举报
回复
这个都能死锁? 用SQL PROFILER跟踪下。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧