我有一个小的wicket应用程序,用户可以登录。 当他们登录时,会在数据库中写入日志。在持久化之前,对行进行计数,当我运行压力测试时,有30个用户同时登录和退出,这就是异常的来源。
这个countig和persisting发生在一个带有@Transactional注释的Spring-DAO中,还有一个连接池。计数方法如下所示:
private long getLogSize() {
final CriteriaBuilder cb = getCriteriaBuilder();
final CriteriaQuery<Long> cq = cb.createQuery(Long.class);
final Root<UserLog> userLog = cq.from(UserLog.class);
cq.select(cb.count(userLog ));
return query.getSingleResult();
}
那么如何锁定桌子并防止比赛情况呢?将查询设置为setLockMode(LockModeType.PESSIMISTIC_READ)不起作用,只有我得到:MySQLTransactionRollbackException:尝试获取锁定时发现死锁;尝试重新启动交易。