Tôi có câu hỏi về cách chú thích @Transactional quản lý mã và thực thi giao dịch. Với một ứng dụng mùa xuân một cách chính xác cài đặt và đoạn mã sau:sử dụng @Transactional cho an toàn chủ đề
@Transactional
public void withdraw(int amount) {
if(isEnoughFunds(amount)) {
decreaseFunds(amount);
}
}
Có thể cho các tình huống sau xảy ra:
- quỹ == 100; lượng == 100
- thread vào rút/giao dịch A bắt đầu
- thread thực thi isEnoughFunds đó để đánh giá đúng
- thread B vào rút/giao dịch B bắt đầu
- thread B thực hiện isEnoughFunds đó để đánh giá đúng
- chủ đề A thực hiện reduceFunds/thread Một ổ khóa db ghi
- chủ đề B chờ thread A để giao dịch và giải phóng khóa viết
- chủ đề Thoát/giao dịch rút tiền A cam kết
- thread B thực hiện decreaseFunds/khóa thread B DB ghi
- thoát thread B rút/giao dịch B cam kết
- quỹ == -100
Nếu đây là có thể làm thế nào bạn sẽ ngăn chặn điều đó?
chú thích vừa nói để bao bọc trong giao dịch. mức cô lập cơ sở dữ liệu xác định có bao nhiêu xen kẽ xảy ra. –