我正在使用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应该提供禁用和启用用户帐户的方法,但我没有找到它们。
感谢任何提示。