Ví dụ về giao dịch trong MySQL là gì?

Giao dịch là một đơn vị nguyên tử của hoạt động cơ sở dữ liệu đối với dữ liệu trong một hoặc nhiều cơ sở dữ liệu. Tác động của tất cả các câu lệnh SQL trong một giao dịch có thể được cam kết hoàn toàn với cơ sở dữ liệu hoặc tất cả được khôi phục

MySQL hỗ trợ một số công cụ lưu trữ. InnoDB hoàn toàn tuân thủ ACID. ACID là viết tắt của Atomicity, Consistency, Isolation và Durability. Các giao dịch đáng tin cậy phải hỗ trợ tất cả bốn thuộc tính này

Các hoạt động trong một giao dịch phải là nguyên tử. Điều này có nghĩa là tất cả các hoạt động thành công hoặc thất bại. Đây là quy tắc tất cả hoặc không có gì. Thuộc tính nhất quán đảm bảo rằng cơ sở dữ liệu ở trạng thái nhất quán sau khi giao dịch kết thúc. Dữ liệu là hợp lệ và không có hồ sơ hoàn thành một nửa. Ví dụ: không còn khách hàng mà không có hồ sơ thanh toán hoặc không có hồ sơ thanh toán mà không có khách hàng. Cách ly là yêu cầu các hoạt động khác không thể truy cập dữ liệu đã được sửa đổi trong một giao dịch chưa hoàn thành. Câu hỏi về sự cô lập xảy ra trong trường hợp giao dịch đồng thời. Nếu không được cách ly, dữ liệu có thể ở trạng thái không nhất quán. Độ bền là khả năng hệ thống cơ sở dữ liệu khôi phục các bản cập nhật giao dịch đã cam kết chống lại bất kỳ loại lỗi hệ thống nào

mức độ cô lập

Trong môi trường đồng thời cao, các giao dịch bị cô lập cao có thể dẫn đến bế tắc. Bế tắc là một tình huống trong đó các giao dịch cạnh tranh tài nguyên và ngăn cản nhau truy cập tài nguyên một cách hiệu quả. Hơn nữa, có sự đánh đổi giữa mức độ cô lập và hiệu suất của cơ sở dữ liệu. Do đó, các hệ thống cơ sở dữ liệu cung cấp một số mức độ cô lập cho các giao dịch

MySQL cung cấp bốn cấp độ cô lập giao dịch

  • tuần tự hóa
  • đọc lặp lại
  • Đọc cam kết
  • Đọc không cam kết

Ở mức cô lập có thể tuần tự hóa, tất cả các giao dịch xảy ra theo cách hoàn toàn cô lập. Tất cả các giao dịch được thực hiện lần lượt. Trong một câu lệnh mức cô lập đọc có thể lặp lại không thể đọc dữ liệu đã được sửa đổi nhưng chưa được thực hiện bởi các giao dịch khác. Không có giao dịch nào khác có thể sửa đổi dữ liệu đã được đọc bởi giao dịch hiện tại cho đến khi giao dịch hiện tại hoàn tất. Đây là mức cô lập mặc định cho InnoDB. Trong một câu lệnh mức cô lập đã cam kết đọc không thể đọc dữ liệu đã được sửa đổi nhưng không được cam kết bởi các giao dịch khác. Các câu lệnh đợi cho đến khi các hàng dữ liệu bị khóa ghi bởi các giao dịch khác được mở khóa trước khi chúng có khóa riêng. Điều này ngăn họ đọc dữ liệu bẩn. Ở mức cô lập chưa được cam kết đọc, các câu lệnh có thể đọc các hàng đã được sửa đổi bởi các giao dịch khác nhưng chưa được cam kết

Đọc ảo, đọc không lặp lại và đọc bẩn là những vấn đề có thể gặp phải khi các giao dịch không được tách biệt hoàn toàn. Đọc ảo xảy ra khi một giao dịch thực hiện lại một truy vấn trả về một tập hợp các hàng thỏa mãn điều kiện tìm kiếm và thấy rằng tập hợp các hàng thỏa mãn điều kiện đã thay đổi do một giao dịch khác được thực hiện gần đây. Việc đọc không thể lặp lại xảy ra khi một giao dịch đọc lại dữ liệu mà nó đã đọc trước đó và phát hiện ra rằng dữ liệu đã bị sửa đổi bởi một giao dịch khác. Điều đó đã cam kết kể từ lần đọc đầu tiên. Đọc bẩn xảy ra khi một giao dịch đọc dữ liệu từ một hàng đã được sửa đổi bởi một giao dịch khác, nhưng chưa được cam kết

Bảng sau đây hiển thị tất cả các mức cô lập và các sự cố có thể xảy ra với chúng

Mức cô lập Đọc ma Không thể đọc lặp lại Đọc bẩnĐọc nối tiếpKhông thểKhông thểKhông thểKhông thểĐọc lặp lạiCó thểKhông thểKhông thểĐọc đã cam kếtCó thểCó thểKhông thểĐọc không được cam kếtCó thểCó thểCó thể

Mức cô lập giao dịch mặc định cho MySQL là có thể đọc lại

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

Mức cô lập hiện tại được lưu trữ trong biến máy chủ tx_isolation

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+

Chúng ta có thể thay đổi mức cô lập bằng câu lệnh

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
4

MySQL cũng tự động thực hiện các câu lệnh không phải là một phần của giao dịch. Kết quả của bất kỳ câu lệnh

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
5 hoặc
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
6 nào không có dấu
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
7 ở trước sẽ ngay lập tức hiển thị với tất cả các kết nối

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+

Biến autocommit được đặt theo mặc định

mysql> SET autocommit=0;

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+

Tự động cam kết có thể được tắt

Bây giờ chúng ta sẽ chứng minh biến autocommint

________số 8_______

Tự động cam kết được thiết lập. Chúng tôi tạo một bảng

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
8 đơn giản với công cụ lưu trữ InnoDB, hỗ trợ các giao dịch

mysql> INSERT INTO Test VALUES [1], [2], [3];

mysql> SELECT * FROM Test;
+-----+
| Num |
+-----+
|   1 |
|   2 |
|   3 |
+-----+

Chúng tôi chèn ba hàng vào cột của bảng. Các giá trị được cam kết ngay lập tức

mysql> SET autocommit=0;

mysql> INSERT INTO Test VALUES [4], [5];

mysql> SELECT * FROM Test;
+-----+
| Num |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
+-----+

Bây giờ chúng tôi đặt biến autocommit thành false. Chúng tôi chèn hai giá trị và chọn tất cả dữ liệu từ bảng. Bây giờ chúng tôi có 5 hàng trong bảng

mysql> ROLLBACK;

mysql> SELECT * FROM Test;
+-----+
| Num |
+-----+
|   1 |
|   2 |
|   3 |
+-----+

Tuy nhiên, dữ liệu không được ghi vĩnh viễn vào bảng. Với câu lệnh

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
9, chúng tôi lấy lại chúng

mysql> INSERT INTO Test VALUES [4], [5];

mysql> COMMIT;

mysql> ROLLBACK;

mysql> SELECT * FROM Test;
+-----+
| Num |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
+-----+

Bây giờ chúng ta chèn lại các giá trị 4, 5. Lần này, các hàng được cam kết với câu lệnh

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
0. Tuyên bố rollback tiếp theo không có hiệu lực

Bắt đầu giao dịch

Khi bật tính năng tự động xác nhận, mỗi câu lệnh SQL đơn lẻ sẽ tự động được bao bọc trong giao dịch của chính nó. Để bắt đầu giao dịch của riêng mình, chúng tôi đưa ra tuyên bố

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1. Giao dịch sau đó kết thúc với các câu lệnh
mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
0 hoặc
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
9. Nhiều tuyên bố có thể được ban hành trong phần thân của giao dịch. Tất cả đều được cam kết hoặc khôi phục dưới dạng một đơn vị

mysql> TRUNCATE Test;
Query OK, 0 rows affected [0.02 sec]

mysql> SELECT * FROM Test;
Empty set [0.00 sec]

Chúng tôi sẽ làm việc với cùng một bảng

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
8. Chúng tôi cắt bớt dữ liệu trong bảng

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
0

Trong đoạn mã trên, chúng tôi bắt đầu một giao dịch và chèn bốn hàng vào bảng. Các giá trị chưa được cam kết. Từ kết nối hiện tại, các hàng có thể nhìn thấy

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
1

Tuy nhiên, từ một kết nối khác, bảng Kiểm tra trống. Chúng tôi khởi chạy phiên bản mới của chương trình khách hàng

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
5. Đây là một kết nối khác với cơ sở dữ liệu MySQL. Từ kết nối này, các giá trị vẫn chưa hiển thị

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
2

Cuối cùng, câu lệnh

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
0 cam kết dữ liệu vào bảng. Các hàng có thể nhìn thấy từ cả hai kết nối

Chúng tôi bắt đầu một giao dịch khác. Lần này dữ liệu sẽ được khôi phục

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
3

Trong mã SQL ở trên, chúng tôi bắt đầu một giao dịch mới. Chúng tôi chèn bốn giá trị vào bảng Kiểm tra. Chúng tôi khôi phục các thay đổi bằng câu lệnh

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
9. Lựa chọn tiếp theo từ bảng cho thấy dữ liệu không được cam kết với bảng

Làm cách nào để sử dụng giao dịch trong MySQL?

Bắt đầu giao dịch bằng cách đưa ra lệnh SQL BEGIN WORK. Đưa ra một hoặc nhiều lệnh SQL như CHỌN, CHÈN, CẬP NHẬT hoặc XÓA. Kiểm tra xem không có lỗi và mọi thứ đều theo yêu cầu của bạn. Nếu có lỗi thì ra lệnh ROLLBACK, ngược lại ra lệnh COMMIT.

Khi nào sử dụng giao dịch trong MySQL?

Giao dịch MySQL cho phép bạn thực thi một tập hợp các thao tác MySQL để đảm bảo rằng cơ sở dữ liệu không bao giờ chứa kết quả của các thao tác từng phần . Trong một tập hợp các hoạt động, nếu một trong số chúng không thành công, quá trình khôi phục sẽ xảy ra để khôi phục cơ sở dữ liệu về trạng thái ban đầu.

Ví dụ về giao dịch cơ sở dữ liệu là gì?

Mọi phép tính logic được thực hiện ở chế độ nhất quán trong cơ sở dữ liệu được gọi là giao dịch. Một ví dụ là chuyển khoản từ tài khoản ngân hàng này sang tài khoản ngân hàng khác . giao dịch hoàn chỉnh yêu cầu trừ số tiền được chuyển từ một tài khoản và cộng số tiền tương tự vào tài khoản kia.

Các loại giao dịch khác nhau trong MySQL là gì?

InnoDB cung cấp cả bốn mức cô lập giao dịch được mô tả bởi SQL. tiêu chuẩn 1992. READ UNCOMMITTED , READ CAM KẾT , REPEATABLE READ và SERIALIZABLE .

Chủ Đề