Hướng dẫn is mongodb good for transactional database - mongodb có tốt cho cơ sở dữ liệu giao dịch không

Tính chất axit trong hệ thống quản lý cơ sở dữ liệu là gì?

Giao dịch axit đảm bảo rằng cơ sở dữ liệu sẽ ở trạng thái nhất quán sau khi chạy một nhóm hoạt động. Hầu hết các cơ sở dữ liệu cung cấp bảo đảm giao dịch cho các hoạt động ảnh hưởng đến một hồ sơ duy nhất. Tuy nhiên, không phải tất cả các cơ sở dữ liệu đều hỗ trợ các giao dịch hoạt động trên nhiều hồ sơ, có thể liên quan đến các nhà phát triển đã quen với việc sử dụng chúng.

Mô hình dữ liệu của MongoDB cho phép dữ liệu liên quan được lưu trữ cùng nhau trong một tài liệu. Chúng tôi ước tính rằng 80% -90% các ứng dụng mô hình hóa dữ liệu của họ theo cách tận dụng mô hình tài liệu sẽ không yêu cầu các giao dịch đa tài liệu. Tuy nhiên, MongoDB hỗ trợ các giao dịch axit đa tài liệu cho các trường hợp sử dụng yêu cầu chúng. Các nhà phát triển đánh giá cao tính linh hoạt của việc có thể mô hình hóa dữ liệu của họ theo cách thường không yêu cầu các giao dịch đa tài liệu nhưng có khả năng giao dịch đa tài liệu có sẵn trong trường hợp họ làm.

Trong bài viết này, chúng tôi sẽ khám phá một giao dịch axit là gì, làm thế nào để thực hiện một giao dịch trong MongoDB và tại sao và khi nào nên sử dụng một giao dịch.

Giao dịch axit là gì?

Một giao dịch là một nhóm các hoạt động đọc và ghi cơ sở dữ liệu chỉ thành công nếu tất cả các hoạt động trong thành công. Giao dịch có thể tác động đến một hồ sơ hoặc nhiều hồ sơ.

Hãy đi qua một giao dịch ví dụ tác động đến nhiều hồ sơ. Hãy tưởng tượng bạn đang xây dựng một chức năng để chuyển tiền từ tài khoản này sang tài khoản khác trong đó mỗi tài khoản là hồ sơ riêng. Nếu bạn lấy tiền thành công từ tài khoản nguồn, nhưng không bao giờ tin vào điểm đến, bạn có một vấn đề kế toán nghiêm trọng. Bạn có thể có một vấn đề lớn (nếu không lớn hơn) nếu bạn thay vào đó là điểm đến, nhưng không bao giờ lấy tiền ra khỏi nguồn để trang trải nó. Hai hoạt động viết này phải xảy ra cả hai, hoặc cả hai không xảy ra, để giữ cho hệ thống nhất quán.


await session.withTransaction(async () => {
   const subtractMoneyResults = await accountsCollection.updateOne(
       { _id: account1 },
       { $inc: { balance: amount * -1 } },
       { session });
   if (subtractMoneyResults.modifiedCount !== 1) {
       await session.abortTransaction();
       return;
   }

   const addMoneyResults = await accountsCollection.updateOne(
       { _id: account2 },
       { $inc: { balance: amount } },
       { session });
   if (addMoneyResults.modifiedCount !== 1) {
       await session.abortTransaction();
       return;
   }
});

Trong mẫu mã giao dịch này, tiền đang được chuyển từ tài khoản này sang tài khoản khác. Cập nhật cho cả hai tài khoản phải thành công hoặc giao dịch sẽ bị hủy bỏ. Truy cập kho lưu trữ GitHub bắt đầu nhanh Node.js để lấy một bản sao của mẫu mã đầy đủ và tự chạy.

Đây là loại vấn đề mà các giao dịch đa hồ sơ đã được phát minh để giải quyết: chúng tôi nói với cơ sở dữ liệu mà chúng tôi đang thực hiện một giao dịch và nó theo dõi mọi bản cập nhật mà nó thực hiện trên đường đi. Nếu kết nối bị hỏng trước khi giao dịch hoàn tất hoặc nếu bất kỳ lệnh nào trong giao dịch không thành công, thì cơ sở dữ liệu sẽ quay lại (hoàn tác) tất cả các thay đổi mà nó đã viết trong quá trình giao dịch.

Nhược điểm của việc sử dụng một giao dịch là cơ sở dữ liệu phải khóa các tài nguyên liên quan để ngăn chặn việc ghi đồng thời can thiệp với nhau. Điều đó có nghĩa là các khách hàng khác đang cố gắng viết dữ liệu có thể bị kẹt chờ giao dịch hoàn thành, ảnh hưởng đến độ trễ của ứng dụng và cuối cùng là trải nghiệm người dùng.

Các tính chất axit của một giao dịch là gì?

Axit là một từ viết tắt là viết tắt của tính nguyên tử, tính nhất quán, cách ly và độ bền.

Cùng với nhau, các thuộc tính axit này đảm bảo rằng một tập hợp các hoạt động cơ sở dữ liệu (được nhóm lại với nhau trong một giao dịch) để lại cơ sở dữ liệu ở trạng thái hợp lệ ngay cả trong trường hợp các lỗi không mong muốn.

Tính nguyên tử

Tính nguyên tử đảm bảo rằng tất cả các lệnh tạo nên một giao dịch được coi là một đơn vị duy nhất và thành công hoặc thất bại cùng nhau. Điều này rất quan trọng như trong trường hợp của một sự kiện không mong muốn, như sự cố hoặc mất điện, chúng ta có thể chắc chắn về trạng thái của cơ sở dữ liệu. Giao dịch sẽ hoàn thành thành công hoặc được quay lại nếu bất kỳ phần nào của giao dịch không thành công.

Nếu chúng ta tiếp tục với ví dụ trên, tiền được khấu trừ từ nguồn và nếu có bất kỳ sự bất thường nào xảy ra, các thay đổi sẽ bị loại bỏ và giao dịch không thành công.

Tính nhất quán

Tính nhất quán đảm bảo rằng những thay đổi được thực hiện trong một giao dịch phù hợp với các ràng buộc cơ sở dữ liệu. Điều này bao gồm tất cả các quy tắc, ràng buộc và kích hoạt. Nếu dữ liệu vào trạng thái bất hợp pháp, toàn bộ giao dịch sẽ thất bại.

Quay trở lại ví dụ về chuyển tiền, hãy để nói rằng có một ràng buộc rằng số dư phải là một số nguyên tích cực. Nếu chúng ta cố gắng vượt qua tiền, thì số dư đã giành được sự ràng buộc. Do đó, tính nhất quán của giao dịch axit sẽ bị vi phạm và giao dịch sẽ thất bại.

Sự cách ly

Sự cô lập đảm bảo rằng tất cả các giao dịch chạy trong một môi trường bị cô lập. Điều đó cho phép chạy các giao dịch đồng thời vì các giao dịch không can thiệp vào nhau.

Ví dụ, hãy để nói rằng số dư tài khoản của chúng tôi là $ 200. Hai giao dịch để rút tiền 100 đô la bắt đầu cùng một lúc. Các giao dịch chạy trong sự cô lập đảm bảo rằng khi cả hai hoàn thành, chúng tôi sẽ có số dư là 0 đô la thay vì 100 đô la.

Độ bền

Độ bền đảm bảo rằng một khi giao dịch hoàn thành và các thay đổi được ghi vào cơ sở dữ liệu, chúng vẫn tồn tại. Điều này đảm bảo rằng dữ liệu trong hệ thống sẽ tồn tại ngay cả trong trường hợp các lỗi hệ thống như sự cố hoặc mất điện.

Các đặc điểm axit của các giao dịch là những gì cho phép các nhà phát triển thực hiện các bản cập nhật phức tạp, phối hợp và ngủ ngon vào ban đêm khi biết rằng dữ liệu của họ phù hợp và được lưu trữ an toàn.

Trong MongoDB, các bản cập nhật đơn tính luôn luôn được nguyên tử. Mô hình tài liệu cho vay để lưu trữ dữ liệu liên quan được truy cập cùng nhau trong một tài liệu duy nhất (so với mô hình quan hệ, trong đó dữ liệu liên quan có thể được chuẩn hóa và phân chia giữa nhiều bảng). Trong hầu hết các trường hợp, một lược đồ tài liệu được thiết kế tốt cho phép bạn làm việc mà không cần các giao dịch đa tài liệu.

Khi bạn cần tuân thủ axit đa tài liệu, các giao dịch MongoDB hoạt động trên cụm của bạn và vận hành theo cách bạn mong đợi. Có chi phí hiệu suất để sử dụng các giao dịch trong một hệ thống phân tán, vì vậy bạn sẽ muốn chú ý đến các ràng buộc tài nguyên và mục tiêu hiệu suất của mình.

Ví dụ giao dịch axit là gì?

Hãy tiếp tục với ví dụ ngân hàng mà chúng tôi đã thảo luận trước đó trong bài viết mà tiền đang được chuyển từ tài khoản này sang tài khoản khác. Hãy xem xét từng tính chất axit trong ví dụ này:

  • Tính nguyên tử: Tiền cần được xóa cả từ một tài khoản này và được thêm vào tài khoản khác, hoặc giao dịch sẽ bị hủy bỏ. Loại bỏ tiền khỏi một tài khoản mà không cần thêm nó vào một tài khoản khác sẽ để lại dữ liệu ở trạng thái không nhất quán.: Money needs to both be removed from one account and added to the other, or the transaction will be aborted. Removing money from one account without adding it to another would leave the data in an inconsistent state.
  • Tính nhất quán: Xem xét một ràng buộc cơ sở dữ liệu rằng số dư tài khoản không thể giảm xuống dưới 0 đô la. Tất cả các bản cập nhật cho số dư tài khoản bên trong giao dịch phải để lại tài khoản với số dư hợp lệ, không âm hoặc giao dịch nên bị hủy bỏ.: Consider a database constraint that an account balance cannot drop below zero dollars. All updates to an account balance inside of a transaction must leave the account with a valid, non-negative balance, or the transaction should be aborted.
  • Cách ly: Xem xét hai yêu cầu đồng thời để chuyển tiền từ cùng một tài khoản ngân hàng. Kết quả cuối cùng của việc chạy các yêu cầu chuyển đồng thời phải giống như chạy các yêu cầu chuyển giao tuần tự.: Consider two concurrent requests to transfer money from the same bank account. The final result of running the transfer requests concurrently should be the same as running the transfer requests sequentially.
  • Độ bền: Xem xét lỗi điện ngay sau khi cơ sở dữ liệu xác nhận rằng tiền đã được chuyển từ tài khoản ngân hàng này sang tài khoản khác. Cơ sở dữ liệu vẫn nên giữ thông tin được cập nhật mặc dù có một thất bại bất ngờ.: Consider a power failure immediately after a database has confirmed that money has been transferred from one bank account to another. The database should still hold the updated information even though there was an unexpected failure.

Hướng dẫn is mongodb good for transactional database - mongodb có tốt cho cơ sở dữ liệu giao dịch không
Biểu đồ cho thấy các tính chất axit ảnh hưởng đến dòng tiền chuyển tiền từ tài khoản ngân hàng này sang tài khoản khác.

Tại sao các giao dịch axit lại quan trọng?

Giao dịch axit đảm bảo dữ liệu vẫn phù hợp trong cơ sở dữ liệu. Trong các mô hình dữ liệu trong đó dữ liệu liên quan được phân chia giữa nhiều bản ghi hoặc tài liệu, các giao dịch đa dạng hoặc đa tài liệu có thể rất quan trọng đối với thành công của ứng dụng.

Mô hình tài liệu của MongoDB cho phép các nhà phát triển lưu trữ dữ liệu liên quan lại với nhau trong một tài liệu bằng cách sử dụng các mảng và các đối tượng được nhúng. Chúng tôi ước tính rằng 80% -90% các ứng dụng không cần sử dụng các giao dịch đa tài liệu khi chúng tận dụng mô hình tài liệu để lưu trữ dữ liệu liên quan cùng nhau. MongoDB hỗ trợ các giao dịch đa tài liệu cho các trường hợp sử dụng trong đó dữ liệu liên quan không có trong một tài liệu.

Làm thế nào để các giao dịch axit hoạt động trong MongoDB?

MongoDB đã thêm hỗ trợ cho các giao dịch axit đa tài liệu trong phiên bản 4.0 vào năm 2018 và mở rộng hỗ trợ cho các giao dịch axit đa tài liệu phân tán trong phiên bản 4.2 vào năm 2019.

Mô hình tài liệu của MongoDB cho phép dữ liệu liên quan được lưu trữ cùng nhau trong một tài liệu. Mô hình tài liệu, kết hợp với các bản cập nhật tài liệu nguyên tử, làm giảm nhu cầu giao dịch trong phần lớn các trường hợp sử dụng. Tuy nhiên, có những trường hợp các giao dịch MongoDB đa tài liệu thực sự, đa thu thập là sự lựa chọn tốt nhất.

Các giao dịch MongoDB hoạt động tương tự như các giao dịch trong các cơ sở dữ liệu khác. Để sử dụng một giao dịch, hãy bắt đầu một phiên MongoDB thông qua trình điều khiển. Sau đó, sử dụng phiên đó để thực hiện nhóm hoạt động cơ sở dữ liệu của bạn. Bạn có thể chạy bất kỳ hoạt động CRUD (Tạo, đọc, cập nhật và xóa) nào trên nhiều tài liệu, nhiều bộ sưu tập và nhiều mảnh vỡ.

Đối với các mẫu mã cụ thể về cách thực hiện các giao dịch, hãy xem nhanh bắt đầu trên trung tâm nhà phát triển MongoDB:

  • Giao dịch axit đa tài liệu trong MongoDB với Golang
  • Giao dịch axit đa tài liệu trong MongoDB với Java
  • Giao dịch axit đa tài liệu trong MongoDB với Node.js
  • Giao dịch axit đa tài liệu trong MongoDB với Python

Ghé thăm tài liệu trình điều khiển MongoDB cho các hướng dẫn dành riêng cho ngôn ngữ cho từng ngôn ngữ được MongoDB chính thức hỗ trợ. Xem tài liệu MongoDB để biết danh sách các giao dịch thực tiễn tốt nhất và cân nhắc sản xuất.

Khi nào tôi nên sử dụng các giao dịch đa tài liệu MongoDB?

Như chúng tôi đã đề cập trước đó, chúng tôi ước tính rằng 80% -90% các ứng dụng tận dụng mô hình tài liệu sẽ không cần sử dụng các giao dịch trong MongoDB.

Đối với 10% -20% ứng dụng khác, các giao dịch đa tài liệu có sẵn.

Các ứng dụng yêu cầu giao dịch thường có các trường hợp sử dụng trong đó các giá trị được trao đổi giữa các bên khác nhau. Đây thường là "hệ thống hồ sơ" hoặc "dòng kinh doanh".

Các ứng dụng ví dụ có thể được hưởng lợi từ các giao dịch đa tài liệu bao gồm:

  • Các hệ thống di chuyển tiền, như các ứng dụng ngân hàng, hệ thống xử lý thanh toán và nền tảng giao dịch.
  • Chuỗi cung ứng và hệ thống đặt phòng nơi quyền sở hữu hàng hóa và dịch vụ được chuyển từ bên này sang bên khác.
  • Các hệ thống thanh toán lưu trữ thông tin trong hồ sơ chi tiết cũng như hồ sơ tóm tắt.

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

Nói chung, chúng tôi khuyên bạn nên mô hình hóa dữ liệu theo cách mà dữ liệu được truy cập cùng nhau được lưu trữ cùng nhau. Khi dữ liệu được mô hình hóa theo cách này, bạn sẽ có hiệu suất tốt hơn và các giao dịch sẽ không được yêu cầu.

Đối với các ứng dụng yêu cầu giao dịch, chúng tôi khuyên bạn nên thực hành tốt nhất sau:

  • Chia các giao dịch dài thành các phần nhỏ hơn để chúng không vượt quá thời gian chờ 60 giây mặc định. (Lưu ý rằng thời gian chờ này có thể được mở rộng.) Đảm bảo các hoạt động trong giao dịch của bạn đang sử dụng các chỉ mục để chúng chạy nhanh chóng.

  • Giới hạn mỗi giao dịch đến 1.000 sửa đổi tài liệu.

  • Đảm bảo các mối quan tâm đọc và ghi thích hợp được định cấu hình (lưu ý rằng bắt đầu trong phiên bản 5.0, MongoDB mặc định cho mối quan tâm ghi đa số cần thiết).

  • Thêm các giao dịch xử lý lỗi và thử lại thích hợp mà thất bại do lỗi thoáng qua.

  • Xin lưu ý rằng các giao dịch ảnh hưởng đến nhiều mảnh vỡ sẽ phải chịu chi phí hiệu suất.

Để biết thêm thông tin về các thực tiễn tốt nhất này, hãy xem các giao dịch axit đa tài liệu trên giấy trắng MongoDB cũng như tài liệu MongoDB về các giao dịch.

Bản tóm tắt

Các giao dịch axit cung cấp cho các nhà phát triển sự thoải mái khi biết rằng cơ sở dữ liệu của họ ở trạng thái nhất quán sau khi chạy một bộ hoạt động. Cơ sở dữ liệu quan hệ dựa vào các giao dịch vì cách phân chia dữ liệu liên quan giữa nhiều bảng. Các cơ sở dữ liệu khác như MongoDB hiếm khi cần các giao dịch nhưng cung cấp khả năng trong các giao dịch sự kiện là bắt buộc.

MongoDB Atlas là cơ sở dữ liệu được quản lý đầy đủ của MongoDB và là cách dễ nhất để bắt đầu sử dụng MongoDB. Bắt đầu với các giao dịch bằng cách tạo một cụm Atlas MongoDB miễn phí.

Câu hỏi thường gặp

Giao dịch axit là gì?

Các tính chất axit của một giao dịch là gì?

Axit so với bazơ

Cơ sở dữ liệu nào là tốt nhất cho dữ liệu giao dịch?

Cơ sở dữ liệu SQL cung cấp lợi ích tuyệt vời cho dữ liệu giao dịch có cấu trúc không thay đổi thường xuyên (hoặc hoàn toàn) và khi tính toàn vẹn dữ liệu là tối quan trọng. Nó cũng tốt nhất cho các truy vấn phân tích nhanh. Cơ sở dữ liệu NoQuery cung cấp tính linh hoạt và khả năng mở rộng hơn nhiều, cho vay để phát triển và lặp lại nhanh chóng. provide great benefits for transactional data whose structure doesn't change frequently (or at all) and where data integrity is paramount. It's also best for fast analytical queries. NoSQL databases provide much more flexibility and scalability, which lends itself to rapid development and iteration.

MongoDB có tốt cho OLTP không?

Nền tảng dữ liệu MongoDB có thể được sử dụng trên một loạt các ứng dụng OLTP và phân tích. Với Máy chủ MongoDB và Hồ dữ liệu MongoDB Atlas, bạn có thể giải quyết một loạt các yêu cầu ứng dụng.. With the MongoDB Server and MongoDB Atlas Data Lake, you can address a wide range of application requirements.

MongoDB phù hợp nhất là gì?

MongoDB hoạt động tốt nhất với dữ liệu phi cấu trúc, vì vậy nó rất tốt cho các hệ thống dữ liệu lớn, ứng dụng MapReduce, diễn đàn trang web tin tức và các ứng dụng mạng xã hội.Sử dụng MongoDB khi: bạn đang sử dụng điện toán đám mây.MongoDB là lý tưởng cho điện toán đám mây.Big Data systems, MapReduce applications, news site forums, and social networking applications. Use MongoDB when: You're using cloud computing. MongoDB is ideal for cloud computing.

MongoDB có tốt cho các giao dịch tài chính không?

Hệ thống cơ sở dữ liệu dựa trên tài liệu của MongoDB là một sự phù hợp thực sự tuyệt vời cho ngân hàng, Coleman nói.Cơ sở dữ liệu SQL có thể nắm bắt một loạt các giao dịch dưới dạng một tập hợp các hàng, một hàng cho mỗi giao dịch.is a really great fit” for banking, Coleman said. A SQL database may capture a series of transactions as a set of rows, one per transaction.