Hướng dẫn acid trong mysql

bởi Bạch Ngọc Toàn vào 19/04/2016. Lượt xem: 28,335

Hôm nay tôi muốn đưa bạn tất cả trở lại cho một trong những câu hỏi phỏng vấn về  cơ rất độc đáo mà tôi thấy thường xuyên sử dụng trong các buổi phỏng vấn. Tôi đã từng viết về tính chất ACID này. Trong sự nghiệp của tôi, tôi đã thấy nó trong hàng ngàn cuộc phỏng vấn. Một trong những dịch vụ phổ biến nhất của tôi là giúp mọi người với những câu hỏi phỏng vấn và câu các trả lời. Tôi thường quan sát thấy khi phỏng vấn hết các câu hỏi để hỏi và suy nghĩ của các câu hỏi tiếp theo, họ thường hỏi câu hỏi về thuộc tính  ACID của các cơ sở dữ liệu.

Câu hỏi: ACID là gì trong cơ sở dữ liệu?

Trả lời:

ACID (viết tắt của Atomicity, Consistency, Isolation, Durability) là một khái niệm cơ sở dữ liệu mà các chuyên gia thường tìm kiếm khi đánh giá các cơ sở dữ liệu và kiến trúc ứng dụng. Đối với một cơ sở dữ liệu đáng tin cậy tất cả bốn thuộc tính cần đạt được.

Atomicity là một đề xuất tất cả hoặc không có gì. Tính chất này đảm bảo rằng khi một giao dịch liên quan đến hai hay nhiều xử lý, hoặc là tất cả các xử lý được thực hiện hoặc không có xử lý được thực hiện.
Consistency đảm bảo rằng một giao dịch không bao giờ được thông qua cơ sở dữ liệu của bạn trong tình trạng dở dang. Tính chất này, hoặc là tạo ra toàn bộ trạng thái mới hoặc rollback tất cả các xử lý để về trạng thái ban đầu, nhưng không bao giờ thông qua cơ sở dữ liệu trong trạng thái dở dang.
Isolation giữ giao dịch tách rời nhau cho đến khi chúng đã hoàn tất. Tính chất này đảm bảo rằng hai hoặc nhiều giao dịch không bao giờ được trộn lẫn với nhau, tạo ra dữ liệu không chính xác và không phù hợp.
Durability đảm bảo rằng cơ sở dữ liệu sẽ theo dõi các thay đổi cấp phát trong một cách mà các máy chủ có thể phục hồi từ một sự kết thúc bất thường. Tính chất này đảm bảo rằng trong trường hợp thất bại hay dịch vụ khởi động lại các dữ liệu có sẵn trong  trước khi gặp lỗi.

Hướng dẫn acid trong mysql

Các tính chất ACID của cơ sở dữ liệu được mô tả trong ISO / IEC 10.026-1: 1992 phần 4. Ghi số này nếu bạn muốn gây ấn tượng với người phỏng vấn với kiến thức của bạn. Bạn biết rằng anh ta sẽ hỏi câu hỏi này, tốt hơn sẵn sàng để trả lời câu hỏi này chính xác và gây ấn tượng với anh ấy / cô ấy.

Trích nguồn từ: (http://blog.sqlauthority.com/2016/04/10/acid-properties-database-interview-question-week-066/)

Hướng dẫn acid trong mysql

Bất kỳ ứng dụng nào bao gồm cơ sở dữ liệu phải tuân thủ các đặc điểm ACID, trong các ứng dụng và người quản lý cơ sở dữ liệu chuyên nghiệp, khái niệm ACID đề cập đến các đặc điểm hoặc tính chất đảm bảo rằng các giao dịch trong cơ sở dữ liệu được thực hiện an toàn và đáng tin cậy. Cụ thể, ACID có nghĩa là Nguyên tử, Tính nhất quán, Cách ly và Độ bền.

Hướng dẫn acid trong mysql

Ví dụ, một giao dịch trong cơ sở dữ liệu sẽ chèn một bản ghi hoặc nếu chúng ta xem đó là mô hình kinh doanh Thêm khách hàng mới, Sửa đổi sản phẩm. Giao dịch luôn tạo ra thay đổi, chèn, sửa đổi, xóa, truy vấn không phải là giao dịch vì nó không tạo ra thay đổi.
Đặc điểm kỹ thuật ACID

Nguyên tử

Đó là tài sản đảm bảo và xác minh nếu giao dịch được thực hiện hoặc không được thực hiện và tài sản này cho biết rằng nếu một hoạt động không được hoàn thành thì nó bị hủy, ví dụ: giả sử chúng tôi đang chèn một bản ghi và máy chủ ngừng hoạt động, một bản ghi được ghi lại trong một nửa, sau đó nguyên tử hồ sơ này sẽ không được ghi lại.
Một ví dụ khác nếu thanh toán trực tuyến đang được thực hiện và số tiền trong tài khoản của chúng tôi được chiết khấu nhưng thanh toán không thành công hoặc hệ thống ngừng hoạt động, thì giao dịch là quế và cơ sở dữ liệu không lưu nó.

Kiên định

Đó là tài sản đảm bảo rằng các giao dịch có thể được hoàn thành mà không có vấn đề sẽ được thực hiện. Khái niệm này có liên quan đến tính toàn vẹn của cơ sở dữ liệu. Nó ngăn dữ liệu thay đổi và mất ý thức hoặc còn lại mà không có bất kỳ tham chiếu nào, ví dụ, khách hàng không thể bị xóa trong khi thực hiện bất kỳ giao dịch mua nào tại một số thời điểm. Nếu bạn muốn xóa khách hàng, trước tiên bạn phải xóa tất cả hóa đơn và dữ liệu liên quan đến khách hàng đó.

Cách nhiệt

Đó là tài sản đảm bảo rằng nếu hai hoặc nhiều giao dịch xảy ra cùng một lúc thì chúng sẽ được thực hiện lần lượt và nếu chúng được thực hiện song song thì mỗi giao dịch sẽ thực hiện độc lập với nhau để tránh các lỗi có thể xảy ra.

Độ bền

Đây là tài sản chịu trách nhiệm đảm bảo giao dịch đã được thực hiện và những thay đổi được thực hiện trong giao dịch là vĩnh viễn, ngay cả trong trường hợp có bất kỳ vấn đề nào như thiếu điện hoặc lỗi hệ thống.
MySQL hỗ trợ định dạng InnoDB, một dạng lưu trữ dữ liệu cho MySQL, được bao gồm dưới dạng định dạng bảng tiêu chuẩn trong tất cả các bản phân phối MySQL. Định dạng này hỗ trợ các giao dịch loại ACID và tính toàn vẹn tham chiếu.
Chúng tôi sẽ thực hiện một số ví dụ về triển khai ACID với Mysql, các truy vấn sau đó có thể được thực hiện bằng bất kỳ ngôn ngữ lập trình nào. Trong cơ sở dữ liệu này, mỗi người dùng sẽ có một mức đặc quyền và hành động có thể được thực thi trong hệ thống của công ty. Chúng tôi sẽ chỉ tập trung vào chức năng đó.
Chúng tôi sẽ bắt đầu bằng cách tạo cơ sở dữ liệu SDKDB từ phpmyadmin, sau đó chúng tôi sẽ tạo bảng người dùng và chọn công cụ lưu trữ InnoDB.

Hướng dẫn acid trong mysql

 - Cấu trúc bảng cho bảng `users` TẠO BẢNG NẾU KHÔNG EXISTS` users` (` userid` int (10) KHÔNG NULL, `name` varchar (150) DEFAULT NULL) Engine = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1 ; 

Chúng tôi thêm một số dữ liệu vào bảng người dùng

 XÁC NHẬN VÀO `users` (` iduser`, `name`) GIÁ TRỊ (1, 'Carlos Alberte'), (2, 'Pablo Callejos'), (3, 'Ana Bolena'); 

Trong trường hợp này, chúng tôi tạo khóa chính của bảng người dùng sẽ là người dùng

 - Các chỉ mục của bảng `users` ALTER TABLE` users` THÊM KHÓA CHÍNH (` userid`); 

Tiếp theo chúng ta sẽ tạo bảng mức

 - Cấu trúc bảng cho bảng `level` TẠO BẢNG NẾU KHÔNG EXISTS` level` (` idlevel` int (11) KHÔNG NULL, `level` varchar (50) DEFAULT NULL) Engine = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1 ; 

Chúng tôi thêm một số dữ liệu vào bảng cấp độ

 XÁC NHẬN VÀO `level` (` idlevel`, `level`) GIÁ TRỊ (1, 'Cơ bản'), (2, 'Trung cấp'), (3, 'Nâng cao'); 

Chúng tôi tạo bên dưới bảng đặc quyền, nơi chúng tôi sẽ chỉ ra mức độ quyền của mỗi người dùng

 - Cấu trúc bảng cho bảng `đặc quyền` TẠO BẢNG NẾU KHÔNG EXISTS` đặc quyền` (` idpriv đặc biệt` int (11) KHÔNG NULL, `idlevel` int (11) KHÔNG NULL DEFAULT '0', ` userid` int (11 ) KHÔNG NULL) ĐỘNG CƠ = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1; 

Chúng tôi thêm một số dữ liệu vào bảng đặc quyền

 XÁC NHẬN VÀO `đặc quyền` (` idpriv đặc biệt`, `idlevel`, ` iduser`) GIÁ TRỊ (1, 1, 1), (2, 2, 3), (3, 1, 2); 

Tiếp theo, chúng tôi thêm các mối quan hệ từ trình soạn thảo SQL, tôi gán một khóa ngoại liên quan đến bảng đặc quyền và bảng người dùng thông qua tên người dùng và khóa ngoại liên quan đến đặc quyền cho các cấp thông qua idlelevel.

 - Các bộ lọc cho bảng `đặc quyền` ALTER TABLE` đặc quyền` THÊM CONSTRAINT` levelfk` FOREIGN KEY (`idlevel`) người dùng` (`userid`); 

Tiếp theo chúng tôi tham khảo cơ sở dữ liệu để xem dữ liệu có ổn không

 CHỌN users.name, level.level TỪ người dùng, cấp độ, đặc quyền WHERE đặc quyền.level = level.level ANDuser.user = đặc quyền.user 

Hướng dẫn acid trong mysql

Hãy xem cách nó hoạt động, chúng tôi cố gắng chèn các đặc quyền cho người dùng và cấp độ không tồn tại.
Câu sẽ là các đặc quyền INSERT INTO VALUES sau đây (idpriv đặc quyền, userid, idlevel); do đó

 Các đặc quyền CHỈ VÀO GIÁ TRỊ (6, 8, 10); 

Hướng dẫn acid trong mysql

Điều này gây ra lỗi vì khóa người dùng nước ngoài trong bảng đặc quyền sẽ tạo ra sự không nhất quán nếu chúng tôi thêm người dùng không tồn tại trong bảng người dùng, ở đây chúng tôi tránh lỗi, với định dạng MySam, dữ liệu sẽ được lưu mà không gặp sự cố.
Tiếp theo, chúng tôi sẽ cố gắng xóa người dùng khỏi bảng người dùng:

 XÓA TỪ `user` WHERE userid = 3 

Khi thực thi câu lệnh SQL, nó sẽ báo lỗi, vì máy khách không thể bị xóa vì nó có dữ liệu trong các bảng khác trong trường hợp này, máy khách có id 3 nằm trong bảng đặc quyền, nếu chúng ta muốn xóa nó, trước tiên chúng ta phải xóa nó khỏi tất cả các bảng và sau bảng khách hàng.

$config[ads_text5] not found

Hướng dẫn acid trong mysql

Để loại bỏ loại bản ghi này bằng khóa ngoại, loại được gọi là xóa trong CASCADA được sử dụng, trong đó tất cả các bản ghi liên quan đến một truy vấn cụ thể sẽ bị xóa trong tất cả các bảng có mối quan hệ khóa ngoại. Để thực hiện giao dịch này, chúng tôi sử dụng chức năng BẬT XÓA CASCADE .
Điều đầu tiên sẽ là cấp quyền loại bỏ tầng, hãy nhớ rằng khi bắt đầu theo mặc định, kiểu tham chiếu là RESTRICT chỉ ra rằng dữ liệu trong trường đó của bảng không thể được cập nhật hoặc xóa, đây là để bảo mật mọi câu lệnh không được thực thi Bạn có thể thực hiện bất kỳ giao dịch nào, vì vậy chúng tôi thay đổi quyền sửa đổi và xóa.

 THAY ĐỔI `đặc quyền` THÊM CONSTRAINT` đặc quyềnfk` PHÍ NGOẠI (` userid`) TÀI LIỆU THAM KHẢO` người dùng` (`userid`) TRÊN XÓA CASCADE TRÊN CẬP NHẬT CASCADE; 

Chúng tôi thực hiện lại truy vấn SQL

 XÓA TỪ `user` WHERE userid = 3 

Sau đó, chúng ta có thể thực hiện truy vấn sql để xác minh rằng nó không còn trong bất kỳ bảng nào:

 CHỌN users.name, level.level TỪ người dùng, cấp độ, đặc quyền WHERE đặc quyền.level = level.level AND users.user = đặc quyền người dùng. 

$config[ads_text6] not found

Hướng dẫn acid trong mysql

Người dùng 3 cũng đã bị xóa khỏi bảng người dùng và bảng đặc quyền vì có khóa ngoại cho người dùng.
Điều này cũng tương tự đối với Cập nhật khi sửa đổi, nó có thể được sửa đổi theo tầng để duy trì tính toàn vẹn tham chiếu trong Mysql và mối quan hệ giữa các bảng.
Hãy xem điều gì xảy ra nếu chúng ta thêm dữ liệu không chính xác trong phần chèn chuỗi, ví dụ: chúng ta thêm người dùng, nhưng khi thêm đặc quyền, chúng ta bị nhầm với id

 Người dùng XÁC NHẬN VÀO GIÁ TRỊ (5, 'Núi Julia'); Các đặc quyền INSERT INTO (`idpriv đặc biệt`, ` idlevel`, `iduser`) GIÁ TRỊ (6, 2, 6); 

Trong trường hợp này, người dùng sẽ được lưu nhưng không phải là đặc quyền của họ vì ID 6 không tồn tại trong bảng người dùng.

  • Hướng dẫn acid trong mysql
  • 0