Хорошо, вот мой новый метод selectLockTest:
код:
public static long doSelectLockTest(String threadName) {
System.out.println("[OUTPUT FROM SELECT Lock ]...threadName=" + threadName);
PreparedStatement pst = null;
ResultSet rs = null;
Connection conn = null;
long oid = 0;
try {
String query = "SELECT * FROM table WHERE Host=? ORDER BY UpdateTime asc limit 1 FOR UPDATE";
conn = getNewConnection();
conn.setAutoCommit(false);
pst = conn.prepareStatement(query);
pst.setString(1, DbProperties.UnknownHost);
rs = pst.executeQuery();
if (rs.first()) {
String s = rs.getString("HostName");
oid = rs.getLong("OID");
//Start update then commit
if (oid != 0) {
query = "UPDATE b2bicheckpoint SET HostName=?,UpdateTimestamp=? where OID = ?";
pst = conn.prepareStatement(query);
pst.setString(1, oid + "_host_" + threadName);
pst.setLong(2, getCurrentLongTime());
pst.setLong(3, oid);
System.out.println("Select_Prestatement=" + threadName + "__" + pst);
int result = pst.executeUpdate();
conn.commit();
conn.setAutoCommit(true);
}
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
DBUtil.close(pst);
DBUtil.close(rs);
DBUtil.close(conn);
}
return oid;
}
Результат:
[OUTPUT FROM SELECT Lock ]...threadName=Thread-1
[OUTPUT FROM SELECT Lock ]...threadName=Thread-2
Select_Prestatement=Thread-1_ : SELECT * FROM ..... FOR UPDATE
Select_Prestatement=Thread-2_: SELECT * FROM ...... FOR UPDATE
Select_Prestatement=Thread-1_: UPDATE table SET HostName='host_Thread-1' where OID = 1
Это означает, что два SELECT FOR UPDATE были (по потоку), но было выполнено только одно обновление, и хост thread_1 был сохранен. Это лучше, но это ожидаемое поведение?
Спасибо
Внутри шаблона настраиваемого элемента календаря у вас есть другой настраиваемый элемент календаря, который создает бесконечный цикл календарей. Я не уверен, что вы хотите, но самое простое - поменять календарь в шаблоне на другое имя
.