Mùa xuân - Quản lý giao dịch
Một giao dịch cơ sở dữ liệu là một chuỗi các hành động được coi như một đơn vị công việc. Những hành động này sẽ hoàn thành toàn bộ hoặc không có hiệu lực. Quản lý giao dịch là một phần quan trọng của ứng dụng doanh nghiệp theo định hướng RDBMS để đảm bảo tính toàn vẹn và nhất quán của dữ liệu. Khái niệm giao dịch có thể được mô tả với bốn thuộc tính chính sau đây được mô tả nhưACID -
Atomicity - Một giao dịch nên được coi như một đơn vị hoạt động duy nhất, có nghĩa là toàn bộ chuỗi hoạt động thành công hoặc không thành công.
Consistency - Điều này thể hiện tính nhất quán về tính toàn vẹn tham chiếu của cơ sở dữ liệu, các khóa chính duy nhất trong bảng, v.v.
Isolation- Có thể thực hiện đồng thời nhiều xử lý giao dịch với cùng một tập dữ liệu. Mỗi giao dịch phải được cách ly với các giao dịch khác để ngăn chặn dữ liệu bị hỏng.
Durability - Sau khi giao dịch hoàn tất, kết quả của giao dịch này phải được thực hiện vĩnh viễn và không thể xóa khỏi cơ sở dữ liệu do lỗi hệ thống.
Một hệ thống cơ sở dữ liệu RDBMS thực sẽ đảm bảo tất cả bốn thuộc tính cho mỗi giao dịch. Chế độ xem đơn giản của một giao dịch được cấp cho cơ sở dữ liệu bằng SQL như sau:
Bắt đầu giao dịch bằng lệnh bắt đầu giao dịch .
Thực hiện các thao tác xóa, cập nhật hoặc chèn khác nhau bằng cách sử dụng truy vấn SQL.
Nếu tất cả các hoạt động đều thành công thì hãy thực hiện cam kết nếu không thì sẽ quay lại tất cả các hoạt động.
Spring framework cung cấp một lớp trừu tượng nằm trên các API quản lý giao dịch cơ bản khác nhau. Hỗ trợ giao dịch của Spring nhằm mục đích cung cấp một giải pháp thay thế cho các giao dịch EJB bằng cách thêm các khả năng giao dịch vào POJO. Spring hỗ trợ cả quản lý giao dịch theo chương trình và khai báo. Các EJB yêu cầu máy chủ ứng dụng, nhưng quản lý giao dịch Spring có thể được thực hiện mà không cần máy chủ ứng dụng.
Giao dịch địa phương so với toàn cầu
Các giao dịch cục bộ dành riêng cho một tài nguyên giao dịch đơn lẻ như kết nối JDBC, trong khi các giao dịch toàn cầu có thể kéo dài nhiều tài nguyên giao dịch giống như giao dịch trong hệ thống phân tán.
Quản lý giao dịch cục bộ có thể hữu ích trong môi trường máy tính tập trung nơi các thành phần và tài nguyên ứng dụng được đặt tại một trang web và quản lý giao dịch chỉ liên quan đến trình quản lý dữ liệu cục bộ chạy trên một máy duy nhất. Các giao dịch địa phương dễ dàng được thực hiện hơn.
Quản lý giao dịch toàn cầu được yêu cầu trong môi trường máy tính phân tán, nơi tất cả các tài nguyên được phân phối trên nhiều hệ thống. Trong trường hợp như vậy, việc quản lý giao dịch cần được thực hiện ở cả cấp địa phương và toàn cầu. Một giao dịch phân tán hoặc toàn cầu được thực hiện trên nhiều hệ thống và việc thực thi nó yêu cầu sự phối hợp giữa hệ thống quản lý giao dịch toàn cầu và tất cả những người quản lý dữ liệu cục bộ của tất cả các hệ thống liên quan.
Có lập trình so với Khai báo
Spring hỗ trợ hai loại quản lý giao dịch -
Quản lý giao dịch có lập trình - Điều này có nghĩa là bạn phải quản lý giao dịch với sự trợ giúp của lập trình. Điều đó mang lại cho bạn sự linh hoạt cao độ, nhưng rất khó để duy trì.
Quản lý giao dịch khai báo - Điều này có nghĩa là bạn tách biệt quản lý giao dịch khỏi mã doanh nghiệp. Bạn chỉ sử dụng chú thích hoặc cấu hình dựa trên XML để quản lý các giao dịch.
Quản lý giao dịch khai báo được ưu tiên hơn quản lý giao dịch có lập trình mặc dù nó kém linh hoạt hơn quản lý giao dịch có lập trình, cho phép bạn kiểm soát các giao dịch thông qua mã của mình. Nhưng như một loại mối quan tâm xuyên suốt, quản lý giao dịch khai báo có thể được mô-đun hóa với cách tiếp cận AOP. Spring hỗ trợ quản lý giao dịch khai báo thông qua khuôn khổ Spring AOP.
Tóm tắt giao dịch mùa xuân
Chìa khóa của sự trừu tượng hóa giao dịch Spring được xác định bởi giao diện org.springframework.transaction.PlatformTransactionManager , như sau:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Sr.No | Phương pháp & Mô tả |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) Phương thức này trả về một giao dịch hiện đang hoạt động hoặc tạo một giao dịch mới, theo hành vi lan truyền được chỉ định. |
2 | void commit(TransactionStatus status) Phương thức này cam kết giao dịch nhất định, liên quan đến trạng thái của nó. |
3 | void rollback(TransactionStatus status) Phương thức này thực hiện khôi phục giao dịch đã cho. |
Các TransactionDefinition là giao diện cốt lõi của sự hỗ trợ giao dịch trong mùa xuân và nó được định nghĩa như sau -
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
Sr.No | Phương pháp & Mô tả |
---|---|
1 | int getPropagationBehavior() Phương thức này trả về hành vi lan truyền. Spring cung cấp tất cả các tùy chọn truyền bá giao dịch quen thuộc từ EJB CMT. |
2 | int getIsolationLevel() Phương pháp này trả về mức độ mà giao dịch này bị cô lập với công việc của các giao dịch khác. |
3 | String getName() Phương thức này trả về tên của giao dịch này. |
4 | int getTimeout() Phương thức này trả về thời gian tính bằng giây mà giao dịch phải hoàn tất. |
5 | boolean isReadOnly() Phương thức này trả về liệu giao dịch có ở chế độ chỉ đọc hay không. |
Sau đây là các giá trị có thể có cho mức cô lập:
Sr.No | Cô lập & Mô tả |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT Đây là mức cô lập mặc định. |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED Cho biết rằng việc đọc bẩn được ngăn chặn; đọc không lặp lại và đọc ảo có thể xảy ra. |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED Chỉ ra rằng có thể xảy ra các lần đọc bẩn, đọc không lặp lại và đọc ảo. |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ Chỉ ra rằng việc đọc bẩn và đọc không lặp lại được ngăn chặn; đọc ảo có thể xảy ra. |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE Cho biết rằng việc đọc bẩn, đọc không lặp lại và đọc ảo bị ngăn chặn. |
Sau đây là các giá trị có thể có cho các kiểu lan truyền:
Sr.No. | Tuyên truyền & Mô tả |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY Hỗ trợ giao dịch hiện tại; ném một ngoại lệ nếu không có giao dịch hiện tại nào tồn tại. |
2 | TransactionDefinition.PROPAGATION_NESTED Thực thi trong một giao dịch lồng nhau nếu tồn tại một giao dịch hiện tại. |
3 | TransactionDefinition.PROPAGATION_NEVER Không hỗ trợ giao dịch hiện tại; ném một ngoại lệ nếu một giao dịch hiện tại tồn tại. |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED Không hỗ trợ giao dịch hiện tại; thay vì luôn thực thi không giao dịch. |
5 | TransactionDefinition.PROPAGATION_REQUIRED Hỗ trợ giao dịch hiện tại; tạo một cái mới nếu không có cái nào tồn tại. |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW Tạo giao dịch mới, tạm dừng giao dịch hiện tại nếu có. |
7 | TransactionDefinition.PROPAGATION_SUPPORTS Hỗ trợ giao dịch hiện tại; thực thi phi giao dịch nếu không có. |
số 8 | TransactionDefinition.TIMEOUT_DEFAULT Sử dụng thời gian chờ mặc định của hệ thống giao dịch cơ bản hoặc không sử dụng nếu thời gian chờ không được hỗ trợ. |
Các TransactionStatus giao diện cung cấp một cách đơn giản đối với mã giao dịch để thực hiện giao dịch kiểm soát và truy vấn tình trạng giao dịch.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | boolean hasSavepoint() Phương thức này trả về liệu giao dịch này nội bộ có mang một điểm lưu hay không, tức là đã được tạo dưới dạng giao dịch lồng nhau dựa trên một điểm lưu hay chưa. |
2 | boolean isCompleted() Phương thức này trả về liệu giao dịch này đã hoàn tất hay chưa, tức là liệu giao dịch đã được cam kết hay chưa. |
3 | boolean isNewTransaction() Phương thức này trả về true trong trường hợp giao dịch hiện tại là mới. |
4 | boolean isRollbackOnly() Phương thức này trả về liệu giao dịch có được đánh dấu là chỉ khôi phục hay không. |
5 | void setRollbackOnly() Phương pháp này đặt giao dịch là chỉ khôi phục. |