Các thực tiễn tốt nhất cho các giao dịch mongodb là gì?

Quản lý giao dịch là một khía cạnh quan trọng của việc xây dựng các ứng dụng. Hãy thảo luận về cách Mongo DB và các bản phát hành mới nhất của nó có thể giúp chúng ta đạt được điều đó

MongoDB, với 4. 0, đã thêm hỗ trợ cho Giao dịch nhiều tài liệu hoạt động trên các bộ bản sao. Hỗ trợ này cũng đã được mở rộng cho Sharded Cluster với 4. 2 phát hành

Blog này có thể giúp bạn-

  1. thêm Hỗ trợ giao dịch trong ứng dụng của bạn bằng Java Spring Data và Java Mongo Drivers, và
  2. với những thông lệ tốt nhất cần được tuân theo
điều kiện tiên quyết

Bạn cần có hiểu biết về các khung công tác Core-Java, Spring và Spring-Data cũng như hiểu biết cơ bản về các khái niệm và Truy vấn Mongo

Cơ sở dữ liệu MongoDB NoSQL

MongoDB là một cơ sở dữ liệu NoSQL và về cơ bản khác với mô hình hóa dữ liệu SQL ở chỗ nó luôn khuyến khích có dữ liệu liên quan trong một tài liệu (hãy nhớ rằng MongoDB sẽ hoạt động tốt hơn nếu bạn sử dụng nó đúng cách; tránh sử dụng nó làm cơ sở dữ liệu Quan hệ). Vì MongoDB hỗ trợ các giao dịch ACID trong một tài liệu duy nhất nên các nhà phát triển ứng dụng không phải lo lắng về các đảm bảo ACID trên nhiều tài liệu

Nhưng đôi khi dựa trên nhu cầu và thiết kế ứng dụng của bạn, bạn không thể có mọi thứ trong một tài liệu. Bạn có thể muốn các tài liệu trải rộng trên nhiều bộ sưu tập và các tình huống như vậy yêu cầu đảm bảo ACID

Vì vậy, hãy thảo luận về một số khái niệm xung quanh hỗ trợ Giao dịch MongoDB. Ở phần sau của blog, tôi cũng sẽ chia sẻ đoạn mã giúp bạn thêm hỗ trợ giao dịch trong ứng dụng của mình

Thao tác viết bên ngoài Giao dịch

Nhiều thao tác ghi được thực hiện đồng thời trên cùng một tài liệu bên ngoài phạm vi giao dịch cũng gây ra xung đột ghi. Nhưng với tư cách là nhà phát triển, bạn không phải lo lắng về vấn đề này vì WiredTiger xử lý nội bộ lỗi WriteConfilct và tiếp tục thử lại các bản cập nhật cho đến khi có thể hoàn tất mà không gặp phải bất kỳ xung đột nào hoặc trong MaxTime đã xác định

Tại sao WriteConflicts lại xảy ra?

MongoDB sử dụng các bản cập nhật lạc quan cho đồng thời ở cấp độ tài liệu và WriteConflict cho biết khi nào nhiều người dùng đang cố gắng cập nhật cùng một tài liệu

MongoDB sử dụng WiredTiger Storage Engine để xử lý các sự cố như vậy. Bất kỳ WriteConflict khác không nào thông báo cho công cụ cập nhật các yêu cầu đối với tài liệu có thể gây ra vi phạm đồng thời dữ liệu. Bất cứ khi nào WiredTiger API phát hiện một WriteConflict do vi phạm đồng thời, nó sẽ tăng số liệu WriteConflict và MongoDB sẽ thử lại các bản cập nhật cho đến khi hoàn thành mà không gặp phải bất kỳ xung đột nào

Số lượng lớn WriteConflict có thể gây ra sự chậm trễ trong phản hồi của ứng dụng và bạn sẽ phải cố gắng tìm ra nguyên nhân

Thao tác ghi trong Phạm vi giao dịch

Như đã đề cập, mọi cập nhật gây ra xung đột ghi bên ngoài giao dịch sẽ được công cụ lưu trữ WiredTiger tự động thử lại

Viết bên trong phạm vi giao dịch hoạt động hơi khác một chút. Trong WiredTiger, một bản cập nhật cho tài liệu là lạc quan và hủy bỏ giao dịch trong trường hợp phát hiện xung đột

Hãy xem xét ví dụ sau đây được mô tả trong sơ đồ

Nếu một ứng dụng khác/cùng cố gắng sửa đổi cùng một tài liệu trước khi giao dịch kết thúc, nó sẽ đưa ra lỗi WriteConflict

Từ sơ đồ trên, bạn có thể thấy rằng Giao dịch (t1) phải chịu Xung đột ghi vì cùng một tài liệu (D1) được ứng dụng khác sửa đổi đồng thời trước khi giao dịch kết thúc. Thao tác ghi khác có nằm trong phạm vi giao dịch hay không không quan trọng

Ví dụ về lỗi WriteConflict

Viết hoạt động trong phạm vi giao dịch trong cụm nhiều phân đoạn

Hành vi thao tác Ghi trong cụm Sharded tương tự như những gì đã được giải thích ở trên. Trong môi trường Sharded, bạn có thể thấy lỗi như “StaleConflict” xảy ra trong quá trình di chuyển khối. (Ghi chú. Chunk Migration sẽ được đề cập trong một bài viết khác) Nhưng tóm lại, MongoDB sử dụng cơ chế này để chia nhỏ dữ liệu và phân phối đồng đều dựa trên Shard key

Các nhà phát triển ứng dụng phải có logic để hủy bỏ giao dịch hiện tại và thử lại đối với bất kỳ trường hợp ngoại lệ nào, chẳng hạn như MVCC (Kiểm soát đồng thời nhiều phiên bản) bao gồm xung đột ghi, lỗi mạng tạm thời hoặc cuộc bầu cử bản sao chính

Nếu bạn đang sử dụng Trình điều khiển Mongo-Java cốt lõi, thì API gọi lại mới sẽ kết hợp logic thử lại đối với lỗi cam kết TransientTransactionError hoặc UnknownTransactionCommitResult

Sau đây là Đoạn mã để giới thiệu quản lý giao dịch-

Định cấu hình Trình quản lý giao dịch Mongodb

Để sử dụng Quản lý giao dịch dữ liệu mùa xuân, bạn phải định cấu hình MongoTransactionManager Bean

Hỗ trợ giao dịch với dữ liệu mùa xuân

Với các chú thích Giao dịch và Có thể thử lại, bạn không cần phải tự mình viết thử lại logic để xử lý giao dịch theo cách thủ công

MongoClientOptions

Bạn có thể đặt Mối quan tâm Đọc và Viết thông qua MongoClientOptions

Các phương pháp hay nhất-Tránh tạo các Giao dịch kéo dài

Việc tạo các giao dịch dài hạn và thực hiện các hoạt động quá mức có thể gây ra áp lực cao lên bộ đệm Công cụ lưu trữ WiredTiger

Giới hạn thời gian chạy giao dịch

Giới hạn giao dịch mặc định của MongoDB là 60 giây và mọi giao dịch chạy ngoài giới hạn sẽ bị hủy bỏ. Bạn có thể linh hoạt thay đổi con số này và thực hiện giao dịch trong thời gian dài hơn

Để tránh vấn đề hết thời gian chờ, các giao dịch nên được chia thành các phần nhỏ hơn trong khi không thực hiện gì khác ngoài các hoạt động của DB (tránh thực hiện bất kỳ logic ứng dụng/công việc nào trong giao dịch)

Giao dịch trong một cụm nhiều phân đoạn được phân phối

Các giao dịch ảnh hưởng đến nhiều phân đoạn gây ra chi phí hiệu suất cao hơn khi truy vấn được phát trên nhiều nút tham gia trên mạng.
Xác định các truy vấn và đưa ra chỉ mục phù hợp. Nếu bạn muốn đọc nhất quán trong Đa phân đoạn được phân phối, hãy sử dụng “ảnh chụp nhanh” readConcern. Điều này cung cấp ảnh chụp nhanh nhất quán về dữ liệu của bạn trên nhiều phân đoạn. Sử dụng mức readConcern 'cục bộ' nếu độ trễ là mối lo ngại đối với ứng dụng.

Chọn Viết mối quan tâm trong một cụm nhiều phân đoạn được phân phối

MongoDB cho phép bạn chỉ định WriteConcern để xác định mức độ đảm bảo độ bền khi ghi vào cơ sở dữ liệu

Lưu ý rằng các mối quan tâm ghi có thể áp dụng cho bất kỳ thao tác nào được thực thi đối với cơ sở dữ liệu, bất kể bạn đang chạy một thao tác thông thường đối với một tài liệu hay một giao dịch nhiều tài liệu

Sau đây là các tùy chọn WriteConcern mà bạn có thể định cấu hình trên cơ sở mỗi kết nối, mỗi cơ sở dữ liệu, mỗi bộ sưu tập hoặc thậm chí mỗi hoạt động

Các tùy chọn như sau-

Đã xác nhận ghi- Điều này sẽ sử dụng mối quan tâm Ghi mặc định được định cấu hình trên máy chủ và đợi xác nhận của máy chủ

Bạn có thể chuyển giá trị w để xác định hành vi Ghi xác nhận

W0. Với mối quan tâm này, thao tác ghi sẽ không đợi xác nhận từ máy chủ. Trong trường hợp này, dữ liệu có thể được khôi phục nếu bước xuống chính trước khi thao tác ghi được sao chép sang bước phụ

W1. Với mối quan tâm này, thao tác ghi sẽ chờ xác nhận từ Chính trong trường hợp tập hợp bản sao. Trong trường hợp này, dữ liệu có thể được khôi phục nếu bước xuống chính được sao chép sang bước phụ trước thao tác ghi

W2. Với mối quan tâm này, thao tác ghi sẽ chờ xác nhận từ Chính và một trong các Phụ

W3. Với mối quan tâm này, thao tác ghi sẽ chờ xác nhận từ Chính và cả Thứ hai

Tạp chí được công nhận. Với mối quan tâm này, thao tác Ghi sẽ được máy chủ xác nhận sau khi nó được chuyển vào nhật ký trên máy chủ chính. Hoạt động ghi với mối quan tâm này đảm bảo dữ liệu lâu bền trên đĩa, ngay cả khi máy chủ MongoDB gặp sự cố

Bản sao được công nhận. Đây là một tùy chọn không được dùng nữa và tùy chọn ưu tiên là sử dụng WriteConcern W2, hoạt động giống như mối quan tâm về xác nhận do bộ bản sao

Số đông. Với mối quan tâm này, thao tác ghi sẽ đợi phần lớn các thành viên mang dữ liệu và có thể bầu chọn của bộ bản sao và thao tác này không thể được khôi phục ngay cả trong trường hợp bầu cử sơ bộ. Mối quan tâm này cũng đảm bảo rằng thao tác ghi được ghi vào nhật ký trên phần lớn các bản sao, bao gồm cả bản chính

Tiếp theo là gì?

Nếu bạn là nhà phát triển mới/có kinh nghiệm trung cấp sử dụng MongoDB trong ứng dụng của mình, hãy tìm hiểu các khái niệm MongoDB từ trang web mongodb-university. Tất cả các khóa học đều miễn phí

Tôi hy vọng bài viết hữu ích cho những người muốn thêm hỗ trợ Giao dịch trong MongoDB với khung dữ liệu Spring

MongoDB có tốt cho giao dịch không?

MongoDB luôn cung cấp đảm bảo giao dịch cho các hoạt động trên một tài liệu . nguyên tử. Các hoạt động tài liệu đơn lẻ luôn là nguyên tử trong MongoDB. Các thao tác này có thể ghi vào một hoặc nhiều trường, bao gồm các tài liệu con, các phần tử trong một mảng và thậm chí cả các mảng lồng nhau.

MongoDB xử lý các giao dịch hoặc khóa như thế nào?

MongoDB sử dụng khóa đa chi tiết [1] cho phép khóa các hoạt động ở cấp toàn cầu, cơ sở dữ liệu hoặc bộ sưu tập và cho phép cá nhân . g. , ở cấp độ tài liệu trong WiredTiger).

Các trường hợp sử dụng tốt nhất cho MongoDB là gì?

MongoDB được sử dụng rộng rãi để lưu trữ thông tin và chi tiết sản phẩm của các công ty tài chính và thương mại điện tử . Bạn thậm chí có thể lưu trữ danh mục sản phẩm của thương hiệu của bạn trong đó. MongoDB cũng có thể được sử dụng để lưu trữ và lập mô hình dữ liệu do máy tạo. Để làm được điều này, bạn có thể tìm hiểu tài liệu “Lưu trữ dữ liệu nhật ký”.

Cách tốt nhất để cải thiện hiệu suất của truy vấn MongoDB trong đó truy vấn của bạn tham chiếu đến trường cụ thể trong tài liệu là gì?

Tối ưu hóa hiệu suất truy vấn .
Tạo chỉ mục để hỗ trợ truy vấn
Giới hạn số lượng kết quả truy vấn để giảm nhu cầu mạng
Sử dụng phép chiếu để chỉ trả lại dữ liệu cần thiết
Sử dụng $hint để chọn một chỉ mục cụ thể
Sử dụng toán tử gia tăng để thực hiện thao tác phía máy chủ