Có một giao dịch mở tự nó sẽ gần như không có kết quả. Một đơn giản
BEGIN TRANSACTION
-- wait for a while, doing nothing
-- wait a bit longer
COMMIT
tệ nhất là sẽ giữ một vài byte giá trị trạng thái. Không vấn đề gì.
Hầu hết các chương trình sẽ thực hiện công việc thực tế trong giao dịch và đây là một vấn đề khác. Điểm của một giao dịch là vì vậy bạn có thể chắc chắn rằng một số sự kiện trong cơ sở dữ liệu là đúng đồng thời, mặc dù có những người dùng khác viết vào cùng một cơ sở dữ liệu.
Lấy ví dụ điển hình về việc chuyển tiền giữa các tài khoản ngân hàng. Hệ thống phải đảm bảo rằng tài khoản nguồn tồn tại, có đủ tiền, tài khoản đích tồn tại và cả ghi nợ và tín dụng xảy ra hoặc không xảy ra. Nó phải đảm bảo điều này trong khi các giao dịch khác xảy ra, thậm chí có thể giữa hai tài khoản này. Hệ thống đảm bảo điều này bằng cách lấy các khóa trên các bảng liên quan. Những khóa nào được thực hiện và bao nhiêu công việc của những người khác mà bạn thấy, được kiểm soát bởi mức độ cô lập giao dịch .
Vì vậy, nếu bạn làm nhiều việc, rất có thể các giao dịch khác sẽ được xếp hàng chờ đợi các đối tượng mà bạn giữ khóa. Điều này sẽ làm giảm thông lượng chung của hệ thống. Cuối cùng, họ sẽ đạt đến giới hạn thời gian chờ và thất bại, đó là một vấn đề đối với hành vi hệ thống tổng thể. Nếu bạn sử dụng mức cô lập lạc quan, giao dịch của bạn có thể thất bại khi bạn thử cam kết vì công việc của người khác.
Giữ khóa mất tài nguyên hệ thống. Đây là bộ nhớ mà hệ thống không thể sử dụng để xử lý các yêu cầu khác, giảm thông lượng.
Nếu nhiều công việc đã được thực hiện, hệ thống có thể chọn thực hiện leo thang khóa . Thay vì khóa các hàng riêng lẻ, toàn bộ bảng sẽ bị khóa. Sau đó, nhiều người dùng đồng thời sẽ bị ảnh hưởng, thông lượng hệ thống sẽ giảm hơn nữa và tác động của ứng dụng sẽ lớn hơn.
Thay đổi dữ liệu được ghi vào tệp nhật ký, cũng như các khóa bảo vệ chúng. Chúng không thể bị xóa khỏi nhật ký cho đến khi giao dịch được thực hiện. Do đó giao dịch rất dài có thể gây ra sự phình to tệp nhật ký với các vấn đề liên quan của nó.
Nếu công việc hiện tại sử dụng tempdb, có khả năng cho khối lượng công việc lớn, tài nguyên ở đó có thể được gắn cho đến khi kết thúc giao dịch. Trong trường hợp cực đoan, điều này có thể khiến các nhiệm vụ khác thất bại vì không còn đủ chỗ cho chúng. Tôi đã gặp trường hợp một bản cập nhật được mã hóa kém điền tempdb do đó không còn đủ đĩa cho SORT của báo cáo và báo cáo không thành công.
Nếu bạn chọn ROLLBACK giao dịch, hoặc hệ thống bị lỗi và phục hồi, thời gian để hệ thống trở nên khả dụng một lần nữa sẽ phụ thuộc vào số lượng công việc được thực hiện. Đơn giản chỉ cần mở một giao dịch sẽ không ảnh hưởng đến thời gian phục hồi, đó là số lượng công việc đã được thực hiện. Nếu giao dịch được mở nhưng không hoạt động trong một giờ phục hồi sẽ gần như ngay lập tức. Nếu nó được viết liên tục trong giờ đó thì nguyên tắc chung là thời gian phục hồi cũng sẽ là khoảng một giờ.
Như bạn thấy giao dịch dài có thể có vấn đề. Đối với hệ thống OLTP, cách tốt nhất là có một giao dịch cơ sở dữ liệu cho mỗi giao dịch kinh doanh. Đối với đầu vào quy trình làm việc hàng loạt trong các khối, với các lần xác nhận thường xuyên và khởi động lại logic được mã hóa. Thông thường, vài nghìn bản ghi có thể được xử lý trong một giao dịch DB, nhưng điều này cần được kiểm tra để đồng thời và bán lại mức tiêu thụ.
Đừng bị cám dỗ để đi đến cực đoan khác và tránh hoàn toàn các giao dịch và khóa. Nếu bạn cần duy trì tính nhất quán trong dữ liệu của mình (và tại sao bạn lại sử dụng cơ sở dữ liệu?) Thì mức độ cô lập và giao dịch phục vụ một mục đích rất quan trọng. Tìm hiểu về các lựa chọn của bạn và quyết định số dư đồng thời và tính chính xác mà bạn đã chuẩn bị để sống với từng phần trong ứng dụng của mình.