wwwwwvwwwww 2008-10-31 14:44
浏览 202
已采纳

JDBC事务难题

大牛们 ,,,有一段加了JDBC事务的方法
[code="java"]
public boolean updateStuAcc(int stuID, List accL, int schID) {
boolean b = true;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql1 = "select * from stuAccounts where stuID!=? and Account=?";
String sql2 = "update stuAccounts set Account=? where pactID=?";
String sql3 = "update [" + schID
+ "_StuRefundInfo] set account=? where pactID=? ";
try {
conn = DBCon.getCon();
conn.setAutoCommit(false);
for (int i = 0; i < accL.size(); i++) {
StuUpdateAccDto suaDto = (StuUpdateAccDto) accL.get(i);
ps = conn.prepareStatement(sql1);
ps.setInt(1, stuID);
ps.setString(2, suaDto.getAccount());
rs = ps.executeQuery();
if (rs.next()) {
b = false;
break;
} else {
ps = conn.prepareStatement(sql2);
ps.setString(1, suaDto.getAccount());
ps.setString(2, suaDto.getPactID());
ps.executeUpdate();
ps = conn.prepareStatement(sql3);
ps.setString(1, suaDto.getAccount());
ps.setString(2, suaDto.getPactID());
ps.execute();
}
}
conn.commit();
} catch (SQLException e) {
b = false;
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return b;
}
[/code]

该方法有时候会抛出这样的异常

at java.lang.Thread.run(Thread.java:595)
com.microsoft.sqlserver.jdbc.SQLServerException: 事务(进程 ID 54)与另一个进程被
死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError
(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown
Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePrep
aredStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecC
md.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unkno
wn Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknow
n Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unkn
own Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(
Unknown Source)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(
DelegatingPreparedStatement.java:93)
at dao.StuAllInfoUDao.updateStuAcc(StuAllInfoUDao.java:33)
at workerServlet.SchUpdateStuInfoServlet.doPost(SchUpdateStuInfoServlet.
java:59)

请问是什么原因????

  • 写回答

2条回答

  • tou3921 2008-10-31 16:22
    关注

    [code="java"]
    try {

    conn = DBCon.getCon();

    conn.setAutoCommit(false);

    for (int i = 0; i < accL.size(); i++) {

    StuUpdateAccDto suaDto = (StuUpdateAccDto) accL.get(i);

    ps = conn.prepareStatement(sql1);

    ps.setInt(1, stuID);

    ps.setString(2, suaDto.getAccount());

    rs = ps.executeQuery();

    if (rs.next()) {

    b = false;

    break;

    } else {
    if (ps != null) {

    ps.close();

    }
    ps = conn.prepareStatement(sql2);

    ps.setString(1, suaDto.getAccount());

    ps.setString(2, suaDto.getPactID());

    ps.executeUpdate();
    if (ps != null) {

    ps.close();

    }
    ps = conn.prepareStatement(sql3);

    ps.setString(1, suaDto.getAccount());

    ps.setString(2, suaDto.getPactID());

    ps.execute();

    }

    }

    conn.commit();

    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)