0
我們使用spring-security的JdbcTokenStore來保存oAuth2訪問令牌。同樣的應用程序也嚴重依賴於spring-data-jpa。兩者共享連接池到MySQL數據庫。在spring-data-jpa和spring-security-oauth的JdbcTokenStore之間共享Jdbc連接池時,如何處理事務?
Jdbc默認爲自動提交模式,並且JdbcTokenStore顯示爲假定自動提交處於打開狀態。它從不明確提交更改。
另一方面,Spring數據和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令牌。)
什麼配置可以避免這種情況?