mysql数据库加锁问题
大体的逻辑是先查找符合条件的一条数据,然后对其进行修改,在此过程中会产生并发,因此使用锁。(先在task-表中查询,然后修改task-)下面是代码部分:
try
{
String lock = "lock tables task_" + paper_id
+ " write";
stmt.execute(lock);
if(Alg_Distribute.equals("00")){
//顺序分发
sql4 = "select * from task_"+paper_id+" where Que_ID = '"+Que_ID+"' and Flag_Send = 1 and (flag_submit = '"+logname+"' or flag_submit = '00' or flag_submit = '') order by Sec_ID asc limit 1";
}
else if(Alg_Distribute.equals("11")){
//随机分发
sql4 = "select * from task_"+paper_id+" where Que_ID = '"+Que_ID+"' and Flag_Send = 1 and (flag_submit = '"+logname+"' or flag_submit = '00' or flag_submit = '') order by rand() limit 1";
}
else if(Alg_Distribute.equals("22")){
//倒序分发
sql4 = "select * from task_"+paper_id+" where Que_ID = '"+Que_ID+"' and Flag_Send = 1 and (flag_submit = '"+logname+"' or flag_submit = '00' or flag_submit = '') order by Sec_ID desc limit 1";
}
ResultSet rs4 = stmt.executeQuery(sql4);
ResultSet rs_isshow = stmt.executeQuery(sql4);
rs4 = stmt.executeQuery(sql4);
rs_isshow_isEmpty = !rs4.next();
rs4.beforeFirst();
while (rs4.next()) {
Flag_Send = rs4.getInt("Flag_Send");
Tea_Send1 = rs4.getString("Tea_Send1");
Tea_Send2 = rs4.getString("Tea_Send2");
pic_Path = rs4.getString("PathPic");
Sec_ID = rs4.getString("Sec_ID");
ExamID = rs4.getString("ExamID");
}
if (Flag_Send == 1) {
String sql6 = "update task_" + paper_id
+ " set Flag_Submit= '" + logname
+ "' where Sec_ID = '" + Sec_ID
+ "'";
//************************
st.executeUpdate(sql6);
// stmt.executeUpdate(sql6);
//不知道上面的应该怎么写是用st还是stmt(在上面创建的两个statement对象)
//*********************************************
}
String unlock = "unlock tables";
stmt.execute(unlock);
");
conn.commit();
session.setAttribute("Flag_Mode_num", "11");
}
catch(Exception e)
{
if(conn!=null)
{
conn.rollback();
}
e.printStackTrace();
}
}
经常会出现下面的异常:
javax.servlet.ServletException: Lock wait timeout exceeded; try restarting transaction
程序会出现死锁,直至超时解锁。
恳请各位介绍一下如何解决并发问题