MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tổng quan về các giao dịch ACID nhiều tài liệu trong MongoDB và cách sử dụng chúng

Hệ thống cơ sở dữ liệu có nhiệm vụ đảm bảo tính nhất quán và toàn vẹn của dữ liệu, đặc biệt khi có liên quan đến dữ liệu quan trọng. Các khía cạnh này được thực thi thông qua các giao dịch ACID trong MongoDB. Một giao dịch ACID phải đáp ứng một số quy tắc đã xác định về tính hợp lệ của dữ liệu trước khi thực hiện bất kỳ cập nhật nào đối với cơ sở dữ liệu, nếu không, giao dịch này sẽ bị hủy bỏ và không có thay đổi nào được thực hiện đối với cơ sở dữ liệu. Tất cả các giao dịch cơ sở dữ liệu được coi là một hoạt động logic duy nhất và trong thời gian thực hiện, cơ sở dữ liệu được đặt ở trạng thái không nhất quán cho đến khi các thay đổi đã được cam kết. Các hoạt động thay đổi thành công trạng thái của cơ sở dữ liệu được gọi là giao dịch ghi trong khi những hoạt động không cập nhật cơ sở dữ liệu mà chỉ truy xuất dữ liệu được gọi là giao dịch chỉ đọc. ACID là từ viết tắt của Nguyên tử, Nhất quán, Cô lập và Độ bền.

Cơ sở dữ liệu là một tài nguyên dùng chung có thể được truy cập bởi những người dùng khác nhau tại các thời điểm khác nhau hoặc cùng một lúc. Vì lý do này, các giao dịch đồng thời có thể xảy ra và nếu không được quản lý tốt, chúng có thể dẫn đến sự cố hệ thống, lỗi phần cứng, bế tắc, hiệu suất cơ sở dữ liệu chậm hoặc lặp lại khi thực hiện cùng một giao dịch.

Quy tắc ACID là gì?

Tất cả các hệ thống cơ sở dữ liệu phải đáp ứng các thuộc tính ACID để đảm bảo tính toàn vẹn của dữ liệu.

Nguyên tử

Một giao dịch được coi là một đơn vị hoạt động duy nhất có thể thành công hoàn toàn hoặc thất bại hoàn toàn. Một giao dịch không thể được thực hiện một phần. Nếu bất kỳ điều kiện nào tư vấn một giao dịch không thành công, toàn bộ giao dịch sẽ thất bại hoàn toàn và cơ sở dữ liệu sẽ không thay đổi. Ví dụ:nếu bạn muốn chuyển tiền từ tài khoản X sang Y, ở đây có hai giao dịch, giao dịch đầu tiên là chuyển tiền từ tài khoản X và giao dịch thứ hai là ghi lại số tiền trong Y. Nếu giao dịch đầu tiên không thành công, toàn bộ. giao dịch sẽ bị hủy bỏ

Nhất quán

Khi một hoạt động được phát hành, trước khi thực thi, cơ sở dữ liệu ở trạng thái nhất quán và nó sẽ vẫn như vậy sau mỗi giao dịch. Ngay cả khi có bản cập nhật, giao dịch phải luôn đưa cơ sở dữ liệu về trạng thái hợp lệ, duy trì sự bất biến của cơ sở dữ liệu. Ví dụ:bạn không thể xóa khóa chính đã được tham chiếu như một khóa ngoại trong một bộ sưu tập khác. Tất cả dữ liệu phải đáp ứng các ràng buộc đã xác định để ngăn chặn dữ liệu bị hỏng từ một giao dịch bất hợp pháp.

Cách ly

Nhiều giao dịch chạy đồng thời được thực hiện mà không ảnh hưởng đến nhau và kết quả của chúng phải giống nhau nếu chúng được thực hiện tuần tự. Khi hai hoặc nhiều giao dịch sửa đổi cùng một tài liệu trong MongoDB, có thể xảy ra xung đột. Cơ sở dữ liệu sẽ phát hiện xung đột ngay lập tức trước khi nó được cam kết. Thao tác đầu tiên để có được một khóa trên tài liệu sẽ tiếp tục trong khi thao tác kia sẽ không thành công và thông báo lỗi xung đột sẽ được hiển thị.

Độ bền

Điều này cho thấy rằng, một khi giao dịch đã được thực hiện, các thay đổi phải được duy trì mọi lúc ngay cả trong trường hợp hệ thống bị lỗi, chẳng hạn như do mất điện hoặc ngắt kết nối internet.

Giao dịch với MongoDB ACID

MongoDB là một cơ sở dữ liệu NoSQL dựa trên tài liệu với một lược đồ linh hoạt. Các giao dịch không phải là các hoạt động nên được thực hiện cho mọi hoạt động ghi vì chúng phải chịu chi phí hiệu suất lớn hơn trong một lần ghi tài liệu. Với cấu trúc dựa trên tài liệu và mô hình dữ liệu không chuẩn hóa, sẽ có nhu cầu giao dịch được giảm thiểu. Vì MongoDB cho phép nhúng tài liệu, bạn không nhất thiết phải sử dụng giao dịch để đáp ứng thao tác ghi.

MongoDB phiên bản 4.0 cung cấp hỗ trợ giao dịch đa tài liệu chỉ cho triển khai nhóm bản sao và có thể phiên bản 4.2 sẽ mở rộng hỗ trợ cho các triển khai phân đoạn (theo ghi chú phát hành của họ).

Ví dụ về giao dịch:

Đảm bảo bạn đã đặt bản sao trước. Giả sử bạn có một cơ sở dữ liệu được gọi là ứng dụng và một bộ sưu tập người dùng trong Mongo Shell hãy chạy các lệnh sau:

$ mongos và bạn sẽ thấy một cái gì đó như tên người dùng:PRIMARY>

$use app

$db.users.insert([{_id:1, name: ‘Brian’}, {_id:2, name: ‘Sheila’}, {_id:3, name: ‘James’}])

Chúng tôi cần bắt đầu một phiên cho giao dịch của mình:

$db.getMongo().startSession() and you should see something like 

session { "id" : UUID("dcfa8de5-627d-3b1c-a890-63c9a355520c") }

Sử dụng phiên này, chúng tôi có thể thêm nhiều người dùng hơn bằng giao dịch với các lệnh sau

$session.startTransaction()

session.getDatabase(‘app’).users.insert({_id:4, name:  ‘Hitler’})

Bạn sẽ được giới thiệu với WriteResult ({“nInsterted”:2})

Giao dịch chưa được cam kết và $ db.users.find ({}) thông thường sẽ chỉ cung cấp cho chúng tôi những người dùng đã lưu trước đó. Nhưng nếu chúng ta chạy

$session.getDatabase(“app”).users.find()

bản ghi được thêm cuối cùng sẽ có sẵn trong kết quả trả về. Để thực hiện giao dịch này, chúng tôi chạy lệnh dưới đây

$session.commitTransaction()

Việc sửa đổi giao dịch được lưu trữ trong bộ nhớ, đó là lý do tại sao ngay cả sau khi bị lỗi, dữ liệu sẽ có sẵn khi khôi phục.

Giao dịch ACID nhiều tài liệu trong MongoDB

Đây là các thao tác gồm nhiều câu lệnh cần được thực hiện tuần tự mà không ảnh hưởng đến nhau. Đối với mẫu ở trên, chúng ta có thể tạo hai giao dịch, một để thêm người dùng và một giao dịch khác để cập nhật người dùng với trường tuổi. Tức là

$session.startTransaction()

   db.users.insert({_id:6, name “Ibrahim”})

   db.users.updateOne({_id:3 , {$set:{age:50}}})

session.commit_transaction()

Các giao dịch có thể được áp dụng cho các hoạt động đối với nhiều tài liệu có trong một hoặc nhiều bộ sưu tập / cơ sở dữ liệu. Bất kỳ thay đổi nào do giao dịch tài liệu không ảnh hưởng đến hiệu suất đối với khối lượng công việc không liên quan hoặc không yêu cầu chúng. Cho đến khi giao dịch được cam kết, các ghi chưa cam kết sẽ không được sao chép sang các nút phụ cũng như không thể đọc được bên ngoài giao dịch.

Các phương pháp hay nhất cho giao dịch MongoDB

Các giao dịch nhiều tài liệu chỉ được hỗ trợ trong công cụ lưu trữ WiredTiger. Như đã đề cập trước đây, rất ít ứng dụng yêu cầu giao dịch và nếu vậy, chúng ta nên cố gắng rút ngắn chúng. Mặt khác, đối với một giao dịch ACID đơn lẻ, nếu bạn cố gắng thực hiện quá nhiều thao tác, điều đó có thể dẫn đến áp lực cao đối với bộ đệm WiredTiger. Bộ nhớ đệm luôn được chỉ định để duy trì trạng thái cho tất cả các lần ghi tiếp theo kể từ khi ảnh chụp nhanh cũ nhất được tạo. Điều này có nghĩa là các lần ghi mới sẽ tích lũy trong bộ nhớ cache trong suốt thời gian của giao dịch và sẽ chỉ được xóa sau khi các giao dịch hiện đang chạy trên ảnh chụp nhanh cũ được cam kết hoặc hủy bỏ. Để có hiệu suất cơ sở dữ liệu tốt nhất trên giao dịch, các nhà phát triển nên xem xét:

  1. Luôn sửa đổi một số lượng nhỏ tài liệu trong một giao dịch. Nếu không, bạn sẽ cần chia giao dịch thành các phần khác nhau và xử lý tài liệu theo các đợt khác nhau. Tối đa, xử lý 1000 tài liệu cùng một lúc.
  2. Các trường hợp ngoại lệ tạm thời, chẳng hạn như chờ chọn các trục trặc mạng chính và tạm thời có thể dẫn đến việc hủy bỏ giao dịch. Các nhà phát triển nên thiết lập logic để thử lại giao dịch nếu xuất hiện các lỗi đã xác định.
  3. Định cấu hình thời lượng tối ưu để thực hiện giao dịch từ 60 giây mặc định do MongoDB cung cấp. Bên cạnh đó, sử dụng lập chỉ mục để nó có thể cho phép truy cập dữ liệu nhanh chóng trong giao dịch. Bạn cũng có thể linh hoạt điều chỉnh giao dịch trong việc giải quyết thời gian chờ bằng cách chia nhỏ giao dịch thành nhiều đợt để giao dịch được thực hiện trong giới hạn thời gian.
  4. Phân chia giao dịch của bạn thành một nhóm thao tác nhỏ để nó phù hợp với các ràng buộc về kích thước 16MB. Nếu không, nếu hoạt động cùng với mô tả oplog vượt quá giới hạn này, giao dịch sẽ bị hủy bỏ.
  5. Tất cả dữ liệu liên quan đến một thực thể phải được lưu trữ trong một cấu trúc tài liệu phong phú, duy nhất. Điều này nhằm giảm số lượng tài liệu được lưu vào bộ nhớ đệm khi các trường khác nhau sẽ được thay đổi.

Giới hạn của Giao dịch

  1. Bạn không thể tạo hoặc xóa một bộ sưu tập trong một giao dịch.
  2. Các giao dịch không thể thực hiện ghi vào bộ sưu tập có giới hạn
  3. Các giao dịch mất nhiều thời gian để thực thi và bằng cách nào đó chúng có thể làm chậm hiệu suất của cơ sở dữ liệu.
  4. Kích thước giao dịch được giới hạn ở 16 MB, yêu cầu một giao dịch phải chia bất kỳ giao dịch nào có xu hướng vượt quá kích thước này thành các giao dịch nhỏ hơn.
  5. Việc gửi một số lượng lớn tài liệu vào một giao dịch có thể gây áp lực quá mức lên công cụ WiredTiger và vì công cụ này phụ thuộc vào khả năng chụp nhanh nên sẽ có một lượng lớn các hoạt động chưa được tích hợp trong bộ nhớ. Điều này dẫn đến một số chi phí hiệu suất trên cơ sở dữ liệu.

Kết luận

MongoDB phiên bản 4.0 đã giới thiệu hỗ trợ giao dịch đa tài liệu cho các tập hợp bản sao như một tính năng cải thiện tính toàn vẹn và nhất quán của dữ liệu. Tuy nhiên, có rất ít ứng dụng yêu cầu giao dịch khi sử dụng MongoDB. Có những hạn chế đối với tính năng này khiến nó trở nên non nớt đáng kể so với khái niệm giao dịch. Ví dụ:các giao dịch cho một cụm phân đoạn không được hỗ trợ và chúng không được lớn hơn giới hạn kích thước 16MB. Mô hình hóa dữ liệu cung cấp một cấu trúc tốt hơn để giảm bớt các giao dịch trong cơ sở dữ liệu của bạn. Trừ khi bạn đang xử lý các trường hợp đặc biệt, tốt hơn là bạn nên tránh giao dịch trong MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - $ set để cập nhật hoặc đẩy phần tử Array

  2. Cài đặt / thiết lập Mongos trong Elastic Beanstalk

  3. chỉ mục thưa thớt và giá trị null trong mongo

  4. Tài liệu được nhúng không có Mảng?

  5. Chiếu mục đầu tiên trong một mảng sang trường mới (tổng hợp MongoDB)