2013-01-31 21 views
9

transaction.commit() làm gì?Transaction.commit() trong Hibernate là gì?

Account account = new Account(); 
account.setId(100); 
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("Before Transaction: Balance = " + account.getBalance()); 
double preBal = account.getBalance(); 
account.setBalance(50000000); 
Transaction transaction = session.beginTransaction(); 
session.update(account); 
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("After Transaction: Balance = " + account.getBalance()); 
// transaction.commit();  
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("Pev-Bal=" + preBal + " Curr-Bal=" + account.getBalance()); 

này mang lại cho tôi kết quả:

Hibernate: select account0_.id as id0_1_, account0_.balance as .......... 
Before Transaction: Balance = 300.0 
After Transaction: Balance = 5.0E7 
Pev-Bal=300.0 Curr-Bal=5.0E7 

Nhưng kể từ khi tôi đã không gọi transaction.commit() không có sự thay đổi trong cơ sở dữ liệu.

Điều này có nghĩa là mọi thứ chỉ được thực hiện trên một số cá thể/đối tượng mà không thực sự thay đổi Cơ sở dữ liệu?

Tôi mới dùng Hibernate, vì vậy hãy giúp tôi hiểu. Tôi đang sử dụng chế độ ngủ đông 4.

UPDATE:

NẾU tôi gọi transaction.commit() thì kết quả có dòng này

Hibernate: update account set balance=? where id=? 

Và Cơ sở dữ liệu cũng được cập nhật.

Điều này có nghĩa là không cần gọi transaction.commit() mọi thứ chỉ được thực hiện trên cấp độ thể hiện mà không thực sự thay đổi Cơ sở dữ liệu?

Trả lời

14

Cam kết sẽ làm cho cơ sở dữ liệu cam kết. Những thay đổi đối tượng liên tục sẽ được ghi vào cơ sở dữ liệu. Flushing là quá trình đồng bộ hóa liên tục bên dưới lưu trữ với trạng thái lưu giữ lâu dài trong bộ nhớ. tức là. nó sẽ cập nhật hoặc chèn vào các bảng của bạn trong giao dịch đang chạy, nhưng nó có thể không cam kết những thay đổi này (tùy thuộc vào chế độ xả của bạn).

Khi bạn có đối tượng được lưu giữ lâu dài và bạn thay đổi giá trị trên đó, nó trở nên bẩn và hibernate cần phải tuôn ra những thay đổi này cho lớp kiên trì của bạn. Nó có thể làm điều này tự động cho bạn hoặc bạn có thể cần phải làm điều này bằng tay, mà phụ thuộc vào tuôn chế độ của bạn (tự động hoặc bằng tay) :)

Vì vậy, trong ngắn hạn: transaction.commit() không tuôn phiên , nhưng nó cũng kết thúc đơn vị công việc.

Có một tài liệu tham khảo tương tự như vấn đề của bạn here

1

Không có vấn đề gì bạn sẽ làm, ghi các hoạt động không thể được thực hiện bên ngoài một giao dịch , Hibernate sẽ phàn nàn nếu không có liên tục giao dịch và ném một ngoại lệ. Vì vậy, không có sự lựa chọn ở đây.

Tôi thêm vào báo giá trên bằng @pasacal: Và điều đó sẽ không có hiệu lực DB cho đến khi bạn thực hiện giao dịch.

Để tham khảo nhiều How expensive is committing a hibernate transaction?

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