2010-12-20 20 views
5

Hãy nói rằng tôi có một ứng dụng máy tính để bàn mà đóng vai trò như một nhà để xe cho một loạt các xe:Nhiều Chủ đề truy cập vào cơ sở dữ liệu: một với giao dịch dài, một với các giao dịch ngắn

@Entity 
public class Garage { 
    private List<Car> cars = new ArrayList<Car>(); 
    ... 
} 

Ứng dụng máy tính để bàn có một "mô phỏng "nút bắt đầu một chuỗi mới và bắt đầu gọi các phương thức trên Nhà để xe, Ô tô, Bánh xe, v.v. Mô phỏng này có thể mất tới 10 phút để chạy. Hiện nay tôi có một lớp trông như thế này:

beginTransaction(); 
Garage garage = garageDao.findGarage(1); 
List<Car> cars = garage.getCars(); 
for (Car car : cars) { 
    // call methods on the car to lazily fetch other things like wheels... 
} 
commitTransaction(); 

Mã này chỉ làm "đọc" và không bao giờ "viết"

Vì vậy, ở trên có thể mất nhiều thời gian tùy thuộc vào cách nặng những chiếc xe cần một dịch vụ. Trong khi điều trên xảy ra, người dùng có thể tiếp tục làm việc bằng ứng dụng dành cho máy tính để bàn. Họ có thể chọn thay đổi màu sắc của một chiếc xe đang được sử dụng trong giao dịch trên.

Câu hỏi của tôi là liệu giao dịch dài trên có ngăn chặn sự thay đổi màu của xe không? tức là người dùng thay đổi màu sắc của ô tô trong ứng dụng dành cho máy tính để bàn sẽ bị ngăn không cho thực hiện thay đổi cho đến khi giao dịch dài kết thúc?

+0

Tại sao bạn cần giao dịch để đọc? Bạn đang sử dụng tìm nạp lười? – saugata

+0

Phải là 'chuỗi cập nhật' là một đơn vị giao dịch duy nhất? Hoặc không có cập nhật? Bạn nói "Mã này chỉ làm 'đọc' và không bao giờ 'viết'. Sau đó - như saugata hỏi - tại sao bạn cần giao dịch? –

+0

có các phương pháp được gọi trên xe hơi có thể giống như getWheels() và chúng đang bị lười biếng đã tìm nạp số – digiarnie

Trả lời

4

Tại sao phải không? Theo mặc định, bạn đang sử dụng các giao dịch lạc quan, vì vậy không có khóa nào được áp dụng cho các hàng được đọc (trừ khi bạn không hiển thị cho chúng tôi một số cuộc gọi khóa JPA2()). Cam kết của giao dịch sau đó nên kiểm tra phiên bản tối ưu của các bản ghi (nếu bạn có một phiên bản được xác định) và sử dụng nó để quyết định có cam kết thay đổi hay không.

+0

không, không có khóa() – digiarnie

0

Câu trả lời rất có thể sẽ phụ thuộc vào cơ sở dữ liệu bạn sử dụng và mức độ cách ly giao dịch quan trọng hơn.

Nhưng câu trả lời nói chung là không: Không nên chặn (Nhưng như tôi đã nói, phụ thuộc vào cơ sở dữ liệu và cấp độ giao dịch).

0

Như trên:

Thông thường, các hoạt động chỉ đọc không được chặn hoạt động ghi trong cơ sở dữ liệu. Vì vậy, chuỗi đọc dài của bạn không được chặn các hoạt động viết ngắn.

Tôi cho rằng có thể cấu hình mức cách ly cho cơ sở dữ liệu và kết nối ghi có thể bị chặn bởi câu lệnh đọc dài nhưng đây KHÔNG phải là mặc định trên bất kỳ loại cơ sở dữ liệu nào mà tôi biết.

Các vấn đề liên quan