修改JdbcUserDetailsS​​ervice使用的用户表时,超出了锁定等待超时

时间:2018-08-02 16:32:44

标签: java spring spring-security

我正在使用REST服务,该服务使用spring-security和oAuth令牌对用户进行身份验证。注册后,用户应在注册后一周内单击我发送到其电子邮件的链接。如果他们不这样做,我将阻止该帐户(将更新用户设置为enabled = 0,其中email = ...)。

现在,当他们验证电子邮件时,我将取消阻止该帐户(类似查询)。为此,我有一个简单的方法:

@Transactional
@GetMapping("/email-verification")
public String verification(...) {
    ...
    dbServer.createSqlUpdate("update users set enabled = 1 where email = :email");
    ...
}

请注意,未经身份验证的用户可以执行此请求。 (不确定这是否重要)。

直到最近,我还没有意识到默认的数据源配置使用自动提交功能,并且此代码可以正常工作。因为我实际上想正确使用事务,所以将其添加到配置中:

spring.datasource.tomcat.default-auto-commit=false

从那时起,每次代码尝试修改users表时,我都会收到此异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

我最好的选择是,在请求期间,spring安全性正在(至少)为用户表持有一个开放的事务,该事务具有(至少)读锁定。当我尝试修改表时,我的事务将永远不会获得该锁,因为我是在同一请求中执行此操作的。

我正确吗?如果是这样,修改用户表的正确方法是什么?我想说Spring-security应该提供禁用和启用用户帐户的方法,但我没有找到它们。

感谢任何提示。

0 个答案:

没有答案