我想知道如何確保服務中的某個方法每次只能訪問一次。如何避免java spring中同一會話的控制器方法的併發訪問?
我將通過一個小例子說明:
假設我們有在狀態A(user.state = A)的用戶。這個用戶向我們的java彈簧控制器發送一個HTTP GET請求來獲得一個頁面,例如/ hello。根據他的身份,他將被送到A或B。在此之前,我們將把他的狀態改爲B(見下面的代碼)。
現在,再次假設呼叫dao.doSomething();需要很多時間。如果用戶發送另一個GET(通過刷新其瀏覽器),他將調用完全相同的方法dao.doSomething(),導致2個調用。
你怎麼能避免呢?
如果你發送HTTP 2會發生什麼得到在同一時間?
如何在控制器/服務/模型/數據庫中保持一致?
注1:這裏我們不發出2 HTTP從不同的瀏覽器獲得。我們只是在同一瀏覽器上同時創建它們(我知道最大併發會話解決方案,但這並不能解決我的問題)。
注2:解決方案不應阻止不同用戶對控制器的併發訪問。
我讀過一些關於在服務交易,但我不知道這是解決方案。我也讀過一些關於併發性的內容,但我仍然不明白如何在這裏使用它。
我將不勝感激您的幫助!謝謝!
代碼示例:
@Controller
public class UserController {
@RequestMapping(value='/hello')
public String viewHelloPage() {
// we get the user from a session attribute
if (user.getState() = A) {
user.setStatus(B);
return "pageA";
}
return "pageB";
}
@Service
public class UserService {
Dao dao;
@Override
public void setStatus(User user) {
dao.doSomething();
user.setStatus(B);
}
}
謝謝,但你沒有回答我的問題... – awesome
看到我的編輯。如果你正在修改狀態,你不應該使用GET。如果你希望它是冪等的,使用PUT。如果不是,則POST。如果你試圖強制冪等性,那麼這是一個單獨的問題。 – Floegipoky
感謝您的更新。我的問題以GET請求爲例,但它也適用於POST。用POST,你最終會遇到同樣的問題.... – awesome