Mối quan hệ chính xác giữa một giao dịch cơ sở dữ liệu và khóa là gì?


16

Đây là một câu hỏi khiêm tốn được hỏi trong tinh thần tăng kiến ​​thức của tôi; vui lòng nhẹ nhàng trong phản ứng của bạn.

Là một nhà phát triển ứng dụng lâu năm, tôi biết ở một mức độ nào đó giao dịch là gì (tôi sử dụng chúng mọi lúc). Tạm thời bỏ qua các mức cô lập giao dịch, ở cấp độ cao, giao dịch cho phép một khối công việc hoàn thành hoặc không hoàn toàn, và cho phép một số cách ly nhất định với hoạt động sửa đổi cơ sở dữ liệu khác.

Tôi cũng biết khóa (trong các cơ sở dữ liệu khác nhau) là gì, hoặc ít nhất là cách hành xử (nếu tôi khóa bảng theo cách nào đó một cách rõ ràng, thì không có quy trình hoặc luồng nào khác có thể cập nhật bất cứ điều gì về bảng đó).

Điều tôi đặc biệt không rõ ràng nhất là: trong các cơ sở dữ liệu khác nhau, khi tôi khóa rõ ràng một hàng hoặc bảng, tôi có đang sử dụng các cấu trúc chính xác được sử dụng bởi các cơ sở giao dịch của cơ sở dữ liệu dưới vỏ bọc để giao dịch hoạt động chính xác không?

Đó là, nó xảy ra với tôi rằng để một giao dịch là nguyên tử và bị cô lập, nó phải thực hiện một số khóa. Đây có phải là khóa giao dịch được khởi tạo, ẩn tranasction cùng một loại khóa mà các cơ sở dữ liệu khác nhau cho phép tôi truy cập thông qua các cấu trúc như SELECT FOR UPDATEhoặc LOCKcác lệnh rõ ràng không? Hay hai khái niệm này hoàn toàn khác nhau?

Một lần nữa, tôi xin lỗi vì sự ngây ngô của câu hỏi này; Tôi rất vui khi được chỉ đến các nguồn nền tảng hơn.

Câu trả lời:


12

Khi tôi khóa rõ ràng một hàng hoặc một bảng, tôi có đang sử dụng chính xác các cấu trúc được sử dụng bởi các phương tiện giao dịch của cơ sở dữ liệu dưới vỏ bọc để giao dịch hoạt động chính xác không?

Đúng. Nếu điều đó không đúng, thì 'khóa' của riêng bạn sẽ chỉ nằm trong phạm vi 'khóa' tương tự khác và không tương tác với khóa riêng của động cơ. Vì vậy, bạn sẽ khóa một hàng trong một bảng để ứng dụng khác không bị khóa theo cách tương tự, nhưng khóa của bạn sẽ bị chính động cơ bỏ qua. Những ngữ nghĩa này hiếm khi mong muốn. Hầu hết thời gian một ứng dụng khóa một hàng có nghĩa là 'khóa nó trước mọi phương tiện truy cập / sửa đổi'. Mặt lưu ý rằng cơ chế khóa được đúng ứng dụng cụ làm tồn tại, bởi vì họ là hữu ích. Ví dụ, SQL Server có khóa ứng dụng .

Nó xảy ra với tôi rằng để một giao dịch là nguyên tử và bị cô lập, nó phải thực hiện một số khóa.

Khóa là một phương tiện để đạt được điều này. Sự thay thế chính là phiên bản. Ngày nay, hầu hết các cơ sở dữ liệu đều hỗ trợ cả hai (điều này cũng có nghĩa là nếu bạn 'khóa' một hàng trong ứng dụng nhưng một giao dịch khác sử dụng phiên bản để đọc hàng, nó sẽ đọc nó vì khóa của bạn không chặn các lần đọc phiên bản).

Bạn đang xoay quanh một khái niệm được biết đến trong thế giới triển khai cơ sở dữ liệu là 'giao thức khóa hai pha' . bài viết Wikipedia được liên kết là một khởi đầu tốt. Nếu bạn muốn đọc giải thích chi tiết hơn về chủ đề này, tôi khuyên bạn nên đến thư viện và hỏi vay về Xử lý giao dịch: Khái niệm và Kỹ thuật . Khá nhiều cơ sở dữ liệu ngoài kia, ở cốt lõi của nó, là một triển khai của cuốn sách đó.


Có lẽ bạn có thể thêm về kiểm soát đồng thời lạc quan
ypercubeᵀᴹ

Aha! Bây giờ chúng ta nói chuyện. Thật vậy, ẩn giấu trong tâm trí tôi là MVCC . Cảm ơn bạn đã trả lời rõ ràng, các tài liệu tham khảo tuyệt vời và đã dành thời gian để thực sự đi sâu vào câu hỏi của tôi.
Laird Nelson

3

Một số nền tảng trước khi trả lời câu hỏi của bạn:

Lưu ý: Điều này có liên quan đến Microsoft SQL Server - RDBMS ........

  • Nói một cách rất đơn giản, một giao dịch là một chuỗi các công việc phải được thực hiện dưới dạng một đơn vị logic duy nhất và phải duy trì các thuộc tính ACID.
  • Bất kỳ RDBMS nào cũng phải cung cấp "Các phương tiện khóa" có thể được sử dụng để hoàn thành toàn bộ giao dịch, bằng cách duy trì sự cách ly giao dịch và độ bền của nó. Điều này đảm bảo tính toàn vẹn vật lý của cơ sở dữ liệu.
  • Quan trọng nhất, theo mặc định - các giao dịch được quản lý ở cấp độ kết nối. Vì vậy, khi một giao dịch được bắt đầu trên một kết nối, tất cả các câu lệnh T-SQL (S / I / U / D) được thực hiện trên kết nối đó là một phần của giao dịch cho đến khi giao dịch kết thúc. ( MARS được xử lý khác nhau)

Bây giờ trở lại câu hỏi của bạn:

Khi tôi khóa rõ ràng một hàng hoặc một bảng, tôi có đang sử dụng chính xác các cấu trúc được sử dụng bởi các phương tiện giao dịch của cơ sở dữ liệu dưới vỏ bọc để giao dịch hoạt động chính xác không?

Đúng. Điều này có nghĩa là bạn phải cẩn thận trong việc xác định chuỗi dữ liệu sẽ được sửa đổi và sẽ khiến cơ sở dữ liệu ở trạng thái nhất quán. Nói cách khác, hoạt động DML của bạn phải để cơ sở dữ liệu ở trạng thái nhất quán, giới hạn các quy tắc kinh doanh của tổ chức của bạn. Tuy nhiên, RDBMS (ở đây là SQL Server) có thể thực thi tính toàn vẹn vật lý của giao dịch.

Từ BOL: Khóa và phiên bản hàng ngăn người dùng đọc dữ liệu không được cam kết và ngăn nhiều người dùng cố gắng thay đổi cùng một dữ liệu cùng một lúc. Không khóa hoặc phiên bản hàng, các truy vấn được thực hiện đối với dữ liệu đó có thể tạo ra kết quả không mong muốn bằng cách trả lại dữ liệu chưa được cam kết trong cơ sở dữ liệu.

Đây có phải là khóa giao dịch được khởi tạo, ẩn giao dịch giống như khóa mà các cơ sở dữ liệu khác nhau cho phép tôi truy cập thông qua các cấu trúc như CHỌN CẬP NHẬT hoặc các lệnh LOCK rõ ràng không?

Tất cả mọi thứ trong máy chủ sql được chứa trong một giao dịch. Khi bạn truy cập dữ liệu của mình, RDBMS phải thực hiện các khóa tùy thuộc vào mức cô lập và các Hoạt động bạn đang thực hiện trên dữ liệu của mình. Kiểm tra câu trả lời này để biết thêm chi tiết.

Một số tài liệu tham khảo tốt:


2

Tôi muốn nói rằng các giao dịch là một phần của "giao diện" cơ sở dữ liệu theo nghĩa là bạn là nhà phát triển quyết định khi nào bắt đầu, kết thúc, phải làm gì trong phạm vi giao dịch, v.v. Khóa, như tôi thấy, thuộc về chi tiết triển khai và được sử dụng để truy cập đồng bộ hóa với các đối tượng khác nhau. Trong hầu hết các trường hợp, động cơ tự quyết định cái gì và trong bao lâu sẽ bị khóa. Có nhiều khóa cấp hệ thống không thể thao tác trực tiếp (ví dụ: động cơ có thể khóa một số vùng nhớ nhất định). Ngay cả khi nói đến khóa DML, nhiều trong số chúng xảy ra đằng sau hiện trường (ví dụ, để đảm bảo tính toàn vẹn tham chiếu của Oracle và, theo tôi nhớ, SQLServer có thể đặt khóa trên một hàng tương ứng trong bảng chính nếu bản ghi mới được chèn vào bảng chi tiết) là kết quả của các báo cáo DML được ban hành trong giao dịch.

Khi nói đến các giao dịch, bạn có thể mong đợi ít nhiều hành vi nhất quán từ bất kỳ RDMS nào tuyên bố tuân thủ SQL và hỗ trợ giao dịch, nhưng khi nói đến khóa, hầu như mọi nhà cung cấp đều sử dụng chiến lược và thuật ngữ khác nhau. Phần chung trên tất cả các RMDS theo như tôi có thể nói là sự tương tranh giữa các giao dịch được xác định theo mức cô lập trong khi đồng thời giữa các khóa được kiểm soát bởi các loại khóa (chia sẻ, độc quyền, v.v.).

Tóm lại, khóa là cơ chế cấp thấp để kiểm soát tính nhất quán của các đối tượng và đồng thời. Khóa có thể được ban hành trong quá trình thực thi câu lệnh SQL. Phụ thuộc vào việc thực hiện mức cô lập giao dịch, công cụ có thể đặt các loại khóa khác nhau trên các đối tượng bị ảnh hưởng (hàng, nhóm hàng, chỉ mục, v.v.). Có một số lượng hạn chế của lệnh có sẵn để phát hành khóa thủ công ( SELECT FOR UPDATE, LOCK). Các khóa DML có thể được leo thang (ví dụ, phụ thuộc vào RDMS, trong hàng SQLServer-> trang-> phân vùng-> bảng). Khóa cũng có thể được cấp bởi công cụ cơ sở dữ liệu trong quá trình khởi tạo kết nối, sao lưu, khôi phục, thủ tục / kích hoạt / chức năng / vv biên dịch lại, khởi động, tắt máy, v.v.

Tôi không chắc nếu câu trả lời cho câu hỏi của bạn, nhưng tôi hy vọng nó có ý nghĩa.


Cảm ơn bình luận của bạn. Bạn chắc chắn là gần nhất cho đến nay. Tôi vẫn đang cố gắng xem liệu các giao dịch luôn được thực hiện theo các khóa được sử dụng bởi, giả sử, rõ ràng LOCKhoặc SELECT FOR UPDATEtuyên bố hoặc thông qua một số cơ chế khác.
Laird Nelson

Theo tôi biết, BEGIN TRANSACTIONbản thân nó không có khóa. Khóa sẽ xuất hiện sau các DML trong giao dịch.
a1ex07

Làm rõ - Ý tôi là BEGIN TRANSACTIONchính nó không tạo ra các khóa DML; trên thực tế, nó nên phát hành một số khóa nội bộ vì nó phải phân bổ tài nguyên, thêm một mục vào bảng hệ thống (nếu có) giữ các giao dịch đang hoạt động, v.v.
a1ex07

1

Tôi sẽ sử dụng biệt ngữ SQL Server, nhưng các khái niệm nên giống nhau cho các nhà cung cấp khác:

Mỗi lệnh bạn thực hiện được thực hiện trong một giao dịch. Giao dịch đó có thể được mở rõ ràng bằng BEGIN TRAN, hoặc ngầm định, bởi công cụ cơ sở dữ liệu. Lý do một giao dịch ngầm được mở là vì động cơ vẫn cần duy trì tuân thủ ACID và khả năng phục hồi.

Khi bạn thực hiện CHỌN CẬP NHẬT, điều đó chỉ có nghĩa là trong khi giao dịch được thực hiện, nó sẽ giữ một khóa nhất định.


Cảm ơn bình luận của bạn. Điều đó nhiều tôi biết. Nhưng câu hỏi của tôi vẫn là: khi giao dịch đó được mở, sự cô lập của nó có được thực hiện bằng cách giữ các khóa của chính nó không? Nếu vậy, những ổ khóa đó có phải là loại khóa mà tôi có thể có được một cách rõ ràng không? Hay giao dịch đạt được sự cô lập thông qua các phương tiện khác?
Laird Nelson

2
Vâng, đây là cơ chế tương tự. Cách ly đạt được bằng cách sử dụng khóa trong cả hai chế độ, cùng một khóa bạn có thể có được một cách rõ ràng. Sự khác biệt là nếu bạn không mở một giao dịch một cách rõ ràng, các khóa sẽ được giải phóng khi lệnh kết thúc, trong khi đó trong một giao dịch rõ ràng, các khóa được giữ cho đến khi bạn cam kết (không chính xác 100% vì mức độ cô lập, nhưng đó là ý tưởng chung).
Matan Yungman

Cảm ơn bình luận của bạn. Lý do tôi hỏi câu hỏi của tôi là tôi đã đọc ở đâu đó rằng một số cơ sở dữ liệu sử dụng MVCC làm phương tiện để đạt được các giao dịch ACID, dường như tôi là một cách thực hiện không khóa. Trong những trường hợp như vậy, sau đó, tôi không rõ ràng khi nào tôi muốn phát hành một khóa rõ ràng. Nhưng đó có lẽ là một câu hỏi riêng biệt. :-)
Laird Nelson

@LairdNelson đó là cấp độ cách ly Snapshot cho SQL Server. Hiện tại, nhưng không phải là cơ chế mặc định cho đồng thời. Mặc dù đây là mặc định cho Oracle hoặc Postgresql, IIRC.
Mary

0

Khóa là cần thiết và họ làm cho cơ sở dữ liệu. Điều này ngăn dữ liệu bị hỏng hoặc vô hiệu khi nhiều người dùng cố đọc trong khi những người khác ghi vào cơ sở dữ liệu. Cách ly giao dịch thường được thực hiện bằng cách khóa bất cứ thứ gì được truy cập trong giao dịch. Các ứng dụng thiết kế xấu làm cho việc sử dụng lớn khái niệm khóa cơ sở dữ liệu :) !! Vì vậy, để tránh tập trung khóa vào FK và bố trí dữ liệu của bạn.

Đó là tất cả về ACID: - đọc cái này và nó sẽ làm bạn tỉnh táo! ACID là một tập hợp các thuộc tính mà bạn muốn áp dụng khi sửa đổi cơ sở dữ liệu.

  • ** Nguyên tử
  • Tính nhất quán
  • Sự cô lập
  • Độ bền**

Giao dịch là một tập hợp các thay đổi liên quan được sử dụng để đạt được một số thuộc tính ACID. Giao dịch là công cụ để đạt được các thuộc tính ACID.

Nguyên tử có nghĩa là bạn có thể đảm bảo rằng tất cả các giao dịch xảy ra, hoặc không có giao dịch nào xảy ra; bạn có thể thực hiện các thao tác phức tạp như một đơn vị, tất cả hoặc không có gì, và sự cố, mất điện, lỗi hoặc bất cứ điều gì khác sẽ không cho phép bạn ở trong trạng thái chỉ xảy ra một số thay đổi liên quan.

Tính nhất quán có nghĩa là bạn đảm bảo rằng dữ liệu của bạn sẽ nhất quán; không có ràng buộc nào bạn có trên dữ liệu liên quan sẽ bị vi phạm.

Cô lập có nghĩa là một giao dịch không thể đọc dữ liệu từ một giao dịch khác chưa hoàn thành. Nếu hai giao dịch được thực hiện đồng thời, mỗi giao dịch sẽ nhìn thế giới như thể chúng đang thực hiện tuần tự và nếu một giao dịch cần đọc dữ liệu được viết bởi người khác, nó sẽ phải đợi cho đến khi giao dịch kia kết thúc.

Độ bền có nghĩa là một khi giao dịch hoàn tất, đảm bảo rằng tất cả các thay đổi đã được ghi lại thành một phương tiện bền (như đĩa cứng) và thực tế là giao dịch đã được hoàn thành cũng được ghi lại.

Vì vậy, giao dịch là một cơ chế để đảm bảo các tài sản này; chúng là một cách để nhóm các hành động liên quan lại với nhau sao cho toàn bộ, một nhóm các hoạt động có thể là nguyên tử, tạo ra kết quả nhất quán, được cách ly khỏi các hoạt động khác và được ghi lại lâu dài.


Cám ơn bạn đã góp ý. Tôi ít nhất nhận thức được các thuộc tính của ACID. Điều tôi vẫn chưa rõ là: các giao dịch có triển khai ACID bằng cách sử dụng cùng loại khóa mà tôi có thể sử dụng trực tiếp thông qua các LOCKtuyên bố rõ ràng hay chúng thực hiện bằng cách sử dụng một số cơ chế khác?
Laird Nelson

Cơ sở dữ liệu cung cấp một số mức cô lập giao dịch, kiểm soát mức độ khóa xảy ra khi chọn dữ liệu. Đọc có thể lặp lại, Đọc lặp lại, Đọc cam kết, Đọc không cam kết.
Up_One
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.