【发布时间】:2017-03-26 21:26:14
【问题描述】:
我们正在使用 spring-security 中的 JdbcTokenStore 来持久化 oAuth2 访问令牌。同一个应用程序也严重依赖 spring-data-jpa。两者共享一个到 MySQL 数据库的连接池。
Jdbc 默认为自动提交模式,并且 JdbcTokenStore 似乎是在假设自动提交打开的情况下编写的。它从不明确提交更改。
另一方面,Spring-data 和 JPA 需要一个事务来进行写操作。应用程序使用@Transactional 注释。
我们正在观察以下问题:
- 请求 (1):客户端获取访问令牌。 JdbcTokenStore 将其插入到数据库中。
- 请求(2):然后,客户端在后续请求中使用此访问令牌。此请求被拒绝,因为在数据库中找不到令牌。
如果来自请求 (1) 的事务尚未提交,则可以解释此行为。
我对 Spring 的内部结构不是很熟悉。会不会出现以下情况?
- 某些 JPA 操作从池中获取 JDBC 连接 #1,设置 auto-commit=off,执行任意数量的 SQL 语句,然后提交。
- 请求 (1):JdbcTokenStore 获取相同的 JDBC 连接 #1,执行 INSERT 语句。 (这现在发生在事务中。这没有提交。)
- 请求 (2):JdbcTokenStore 获取不同的 JDBC 连接 #2,执行 SELECT 语句。 (这不会看到未提交的事务。)
- 某些 JPA 操作再次获取 JDBC 连接 #1 并提交。 (现在 oAuth 令牌已提交。)
什么配置可以避免这种情况?
【问题讨论】:
标签: spring jdbc spring-security spring-data spring-data-jpa