2012-05-09 49 views
21

Tôi hiểu một sự hiểu biết chung về khái niệm về một giao dịch cơ sở dữ liệu. Chúng tôi truy cập cơ sở dữ liệu trong giao dịch để đảm bảo các thuộc tính ACID.Phiên cơ sở dữ liệu là gì?

Trong Hibernate, có một khái niệm được gọi là phiên. Việc sử dụng phiên là gì? Khi nào truy cập cơ sở dữ liệu nên xảy ra trong hai phiên thay vì trong cùng một phiên?

Để giải thích thêm, tôi đã nhìn thấy mã Hibernate rằng

  • được một phiên làm việc từ một nhà máy phiên
  • mở một phiên
  • bắt đầu một giao dịch
  • cam kết giao dịch
  • đóng phiên

Những gì tôi cần biết tầm quan trọng của một phiên ở đây là gì? Tại sao không có một cái gì đó giống như một nhà máy giao dịch, bắt đầu giao dịch và cam kết giao dịch?

+1

"Khi nào truy cập cơ sở dữ liệu nên xảy ra trong hai phiên thay vì trong cùng một phiên?" https://developer.atlassian.com/display/CONFDEV/Hibernate+Sessions+and+Transaction+Management+Guidelines –

+0

FYI - có một trang wikipedia: http://en.wikipedia.org/wiki/Session_(computer_science) –

Trả lời

18

Phiên không chỉ là giao dịch mà còn là triển khai mẫu UnitOfWork. Nói cách khác, nó giữ cho các đối tượng được tải, biết các đối tượng nào phải được lưu giữ lâu dài, vv:

Đơn vị công việc theo dõi mọi thứ bạn làm trong một giao dịch kinh doanh có thể ảnh hưởng đến cơ sở dữ liệu. Khi bạn hoàn thành, nó sẽ tìm ra mọi thứ cần được thực hiện để thay đổi cơ sở dữ liệu như là kết quả của công việc của bạn.

Để hiểu rõ hơn mối quan hệ giữa Phiên và Giao dịch, bạn có thể xem this article.

Một phiên Hibernate duy nhất có thể có cùng phạm vi với một giao dịch cơ sở dữ liệu duy nhất.

Đây là mô hình lập trình phổ biến nhất được sử dụng cho mẫu triển khai phiên cho mỗi yêu cầu. Một phiên duy nhất và một giao dịch cơ sở dữ liệu duy nhất thực hiện việc xử lý một sự kiện yêu cầu cụ thể (ví dụ, một yêu cầu Http trong một ứng dụng web). Không bao giờ sử dụng mô hình chống phiên cho từng hoạt động! (Có những trường hợp ngoại lệ cực kỳ hiếm khi phiên làm việc cho mỗi lần hoạt động có thể phù hợp, bạn sẽ không gặp phải điều này nếu bạn chỉ học Hibernate.)

Mô hình lập trình khác là cuộc trò chuyện dài, ví dụ: một ứng dụng triển khai hộp thoại nhiều bước, ví dụ như hộp thoại trình hướng dẫn, để tương tác với người dùng trong một số chu kỳ yêu cầu/phản hồi. Một cách để thực hiện điều này là mô hình đối tượng phiên cho mỗi yêu cầu-với-tách rời. Một khi các đối tượng liên tục được coi là tách ra trong thời gian suy nghĩ của người dùng và phải được gắn lại với một Phiên mới sau khi chúng đã được sửa đổi.

Tuy nhiên, nên sử dụng mẫu phiên cho mỗi cuộc trò chuyện. Trong trường hợp này, một phiên duy nhất có phạm vi lớn hơn một giao dịch cơ sở dữ liệu duy nhất và nó có thể mở rộng một số giao dịch cơ sở dữ liệu. Mỗi sự kiện yêu cầu được xử lý trong một giao dịch cơ sở dữ liệu duy nhất, nhưng việc xóa phiên sẽ bị trì hoãn cho đến khi kết thúc cuộc hội thoại và giao dịch cơ sở dữ liệu cuối cùng, để làm cho cuộc trò chuyện trở thành nguyên tử. Phiên được giữ trong trạng thái ngắt kết nối, không có kết nối cơ sở dữ liệu mở, trong thời gian suy nghĩ của người dùng. Kiểm soát đồng thời lạc quan tự động của Hibernate (với phiên bản) được sử dụng để phân biệt cuộc hội thoại.

5

@Dmitry đã trả lời rất độc đáo.

Một cách khác để xem phiên là Ví dụ về cách sử dụng cơ sở dữ liệu. Khi bạn tạo một phiên, bạn có một ngữ cảnh sẵn sàng cho bất kỳ tương tác cơ sở dữ liệu nào với các dịch vụ hỗ trợ (ví dụ: giao dịch, bộ nhớ đệm, kết nối, vv) được yêu cầu trong đó. Giao dịch là một dịch vụ độc lập được sử dụng trong phiên.

Ngoài ra phiên là bộ nhớ cache cấp đầu tiên được sử dụng bởi các công cụ lập bản đồ OR điển hình như hibernate. Phiên hoạt động như bối cảnh tạm thời được tạo theo yêu cầu để tạo thuận lợi cho tương tác DB.

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