2010-09-29 44 views
5

Tôi đang đọc về các thuộc tính ACID của cơ sở dữ liệu. Nguyên tử và tính nhất quán dường như liên quan rất chặt chẽ. Tôi tự hỏi nếu có bất kỳ kịch bản nào mà chúng ta cần phải hỗ trợ Atomicity nhưng không hỗ trợ tính nhất quán hoặc ngược lại. Một ví dụ sẽ thực sự hữu ích!Cơ sở dữ liệu có thể hỗ trợ "Atomicity" nhưng không hỗ trợ "Consistency" hoặc ngược lại không?

Trả lời

12

Họ có liên quan phần nào nhưng có sự khác biệt tinh tế.

Nguyên tử có nghĩa là giao dịch của bạn sẽ xảy ra hoặc không xảy ra.

Tính thống nhất có nghĩa là những thứ như tính toàn vẹn tham chiếu được thực thi.

Giả sử bạn bắt đầu giao dịch để thêm hai hàng (tín dụng và ghi nợ tạo thành một giao dịch ngân hàng đơn lẻ). Nguyên tử của điều này không liên quan gì đến tính nhất quán của cơ sở dữ liệu. Tất cả điều đó có nghĩa là cả hai hàng hoặc cả hai hàng sẽ không được thêm vào.

Trên mặt trận nhất quán, giả sử bạn có ràng buộc khóa ngoài từ orders đến products. Nếu bạn cố gắng thêm đơn hàng đề cập đến một sản phẩm không tồn tại, khi tính nhất quán bắt đầu để ngăn bạn thực hiện việc đó.

Cả hai đều là về việc duy trì cơ sở dữ liệu ở trạng thái khả thi, do đó chúng giống nhau. Ví dụ trước đây sẽ đảm bảo ngân hàng không bị mất tiền (hoặc lấy cắp tiền từ bạn), sau này sẽ đảm bảo ứng dụng của bạn không bị bất ngờ bởi các đơn đặt hàng cho các sản phẩm bạn không biết gì về.

+0

Cảm ơn Paxdiablo! – rkg

5

Atomicity:

Trong một giao dịch nguyên tử, một loạt các hoạt động cơ sở dữ liệu hoặc tất cả xảy ra, hoặc không có gì xảy ra. Bảo đảm nguyên nhân ngăn cập nhật cho cơ sở dữ liệu chỉ xảy ra một phần, có thể gây ra sự cố lớn hơn từ chối toàn bộ chuỗi.

Tính nhất quán:

Trong các hệ thống cơ sở dữ liệu, một giao dịch phù hợp là một trong đó không vi phạm bất kỳ ràng buộc toàn vẹn trong khi thực hiện nó. Nếu một giao dịch rời khỏi cơ sở dữ liệu trong một tình trạng bất hợp pháp, đó là hủy bỏ và một lỗi được báo cáo

Một cơ sở dữ liệu có hỗ trợ tính nguyên tố nhưng không nhất quán sẽ cho phép các giao dịch mà rời khỏi cơ sở dữ liệu trong trạng thái không phù hợp (có nghĩa là , vi phạm kiểm tra tính toàn vẹn hoặc tham chiếu), miễn là giao dịch hoàn tất thành công. Ví dụ, bạn có thể thêm một chuỗi vào một cột int miễn là giao dịch thực hiện việc này thành công. Ngược lại, một cơ sở dữ liệu hỗ trợ tính nhất quán nhưng không nguyên tử sẽ cho phép giao dịch một phần hoàn thành, miễn là hiệu ứng của giao dịch đó không phá vỡ bất kỳ kiểm tra tính toàn vẹn nào (ví dụ: khóa ngoại phải khớp với danh tính hiện có).Ví dụ: , bạn có thể thử thêm hàng mới bao gồm chuỗi và giá trị int và thậm chí nếu chèn không thành công một nửa bằng cách mất một nửa dữ liệu, hàng sẽ được cho phép miễn là không có dữ liệu bị mất nào cho cột bắt buộc và không dữ liệu đã được chèn vào một cột được đánh sai.

Có nói rằng, tính thống nhất dựa trên nguyên tử để đảo ngược các giao dịch không nhất quán.

+1

Hiệu chỉnh: Giao dịch không được để cơ sở dữ liệu ở trạng thái vi phạm các ràng buộc sau khi hoàn thành giao dịch. Tuy nhiên, có những trường hợp giao dịch tạm thời vi phạm các ràng buộc, nhưng giải quyết vi phạm trước khi hoàn thành. –

+0

Cảm ơn bạn Graphain và Walter! – rkg

+0

@WalterMitty: Một cơ sở dữ liệu hỗ trợ tính nguyên tử và nhất quán có thể cho phép một giao dịch nguyên tử có các bộ phận cấu thành, nếu được thực hiện riêng lẻ, hãy để cơ sở dữ liệu ở trạng thái không nhất quán.Tôi không nghĩ rằng một cơ sở dữ liệu không hỗ trợ ít nhất một số giao dịch nguyên tử có thể cho phép "mâu thuẫn tạm thời". Hơn nữa, trong khi khả năng trì hoãn thực thi các ràng buộc cho đến khi "cam kết" chắc chắn hữu ích, tôi không biết rằng khả năng đó được ngụ ý bởi thực tế là một cơ sở dữ liệu cụ thể hỗ trợ nguyên tử và nhất quán; Tôi nghĩ rằng cơ sở dữ liệu máy bay phản lực có thể là một counterexample. – supercat

0

Tôi có một sự hiểu biết khác nhau của sự nhất quán trong bối cảnh ACID:

Trong một giao dịch, nếu một mục nhất định của dữ liệu được lấy ra và lấy lại sau trong cùng một giao dịch, không có thay đổi được nhìn thấy. Đó là, giao dịch được cung cấp một trạng thái nhất quán của cơ sở dữ liệu trong suốt giao dịch. Các bản cập nhật duy nhất có thể thay đổi dữ liệu hiển thị cho giao dịch là các bản cập nhật được thực hiện bởi chính giao dịch đó.

Trong suy nghĩ của tôi, điều này tương đương với tính tuần tự.

0

Tôi cũng bị nhầm lẫn khi đọc về nguyên tử & nhất quán. Giả sử có kịch bản để thực hiện chèn hàng loạt 1000 bản ghi trong bảng tài khoản.

Nguyên tử của lô là nếu tất cả 1000 bản ghi được chèn vào hoặc không có bản ghi nào được chèn vào nếu có lỗi.

Nhất quán của lô sẽ bị vi phạm nếu ở cấp bản ghi tài khoản, chúng tôi đã đặt logic để chèn thành công ngay cả khi loại dữ liệu không khớp, hồ sơ liên quan đã được chèn vào bảng khóa ngoại đã xóa sau khi cập nhật bản ghi tài khoản thành công.

Hy vọng ví dụ này sẽ xóa sự nhầm lẫn.

0

Có thực sự là một mối quan hệ chặt chẽ giữa Atomicity và nhất quán, nhưng họ không giống nhau:

  1. Một DBMS có thể (về mặt lý thuyết) hỗ trợ nhất quán và không Atomicity: ví dụ, hãy xem xét một giao dịch mà bao gồm SQL hoạt động O1, O2 và O3. Bây giờ, giả sử rằng sau khi O1 và O2 DB đã ở trạng thái nhất quán. Sau đó, DBMS có thể dừng giao dịch sau O1 và O2 mà không có O3 và vẫn duy trì tính nhất quán. Rõ ràng, một DBMS như vậy không hỗ trợ nguyên tử (vì O3 không được thực thi bởi O1 và O2).

  2. Một DBMS (về mặt lý thuyết) có thể hỗ trợ tính nguyên tử và không nhất quán: điều này có thể xảy ra trong kịch bản nhiều người dùng, nơi nguyên tử chỉ đảm bảo rằng tất cả các hành động của giao dịch sẽ được thực hiện (hoặc không có). đảm bảo rằng các hành động của một giao dịch được thực hiện đồng thời với một giao dịch khác có thể không kết thúc ở trạng thái không nhất quán.

Tuy nhiên, điều tôi tin (nhưng chưa được chứng minh chính thức) là nếu DMBS của bạn đảm bảo cả Atomicity và Isolation, thì nó cũng phải đảm bảo Tính nhất quán.

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