#java #mysql #deadlock
Вопрос:
Когда я вставляю свои данные в базу данных mysql в пиковое время, получая com.mysql.jdbc.исключения.jdbc4.MySQLTransactionRollbackException: Обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию
при этом я приложил свой образец кода
общедоступная статическая пустая история insertPurchaseHistory(SessionHandler s, статус int) вызывает исключение {
PreparedStatement ps = null;
Connection con = null;
boolean isException = false;
String SerialNumbers = s.getSerialNumbers().replace("[", "");
SerialNumbers = SerialNumbers.replace("]", "");
String[] serials = SerialNumbers.split(",");
for (String ticket : serials) {
try {
con = DBPool.getConnection();
String query = "INSERT INTO DLB_SWT_ST_PURCHASE_HISTORY " "(WALLET_ID, SERIAL_NO, MID, "
"TID, TXN_ID, DRAW_NO, " "PRODUCT_CODE, STATUS, LOTTERY_NUMBERS, "
"SHA_KEY, SCHEDULE_ID, DRAW_DATE) " "SELECT " "t.WALLET_ID, t.SERIAL_NUMBER, t.MID, "
"t.TID, ?, t.DRAW_NO, " "t.PRODUCT_CODE, ?, t.LOTTERY_NUMBERS, "
"SHA2(CONCAT(SERIAL_NUMBER, 'amp;0amp;', LOTTERY_NUMBERS),256), ?, t.DRAW_DATE "
"FROM DLB_WB_TICKET AS t WHERE t.ID = ?";
if (InitConfigValues.LOG_SQL) {
ps = new LoggablePreparedStatement(con, query);
} else {
ps = con.prepareStatement(query);
}
ps.setString(1, s.getSessionId());
ps.setInt(2, status);
ps.setString(3, s.getSchId());
ps.setString(4, ticket.trim());
ps.execute();
if (InitConfigValues.LOG_SQL) {
((LoggablePreparedStatement) ps).printQueryString();
}
}
catch (Exception e) {
isException = true;
throw e;
}finally {
if (ps != null)
ps.close();
ps = null;
if (isException) {
con.rollback();
} else {
con.commit();
}
if (con != null)
DBPool.releaseConnectionToPool(con);
}
}
}