2012-09-26 33 views
7

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 đó?

+2

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. –

Trả lời

3

Có, có thể, tùy thuộc vào cấp độ cách ly. Để ngăn chặn nó, bạn có thể có được một khóa đọc từ cơ sở dữ liệu một cách rõ ràng trước khi gọi ifEnoughFunds(). Khóa sẽ được phát hành vào cuối giao dịch. Trong trường hợp này, luồng B sẽ luôn đợi giao dịch A của luồng để commit trước khi kiểm tra.

+4

bạn có thể giải thích thêm về điều này bằng một ví dụ về cách làm điều này vào mùa xuân và ngủ đông không? cảm ơn bạn! –