Kiểm tra mysql nếu giao dịch được mở
Một giao dịch là một nhóm tuần tự các hoạt động thao tác cơ sở dữ liệu, được thực hiện như thể nó là một đơn vị công việc duy nhất. Nói cách khác, một giao dịch sẽ không bao giờ hoàn thành trừ khi từng hoạt động riêng lẻ trong nhóm thành công. Nếu bất kỳ hoạt động nào trong giao dịch không thành công, toàn bộ giao dịch sẽ thất bại Show
Trên thực tế, bạn sẽ gộp nhiều truy vấn SQL thành một nhóm và bạn sẽ thực hiện tất cả chúng cùng nhau như một phần của giao dịch Thuộc tính của giao dịchCác giao dịch có bốn thuộc tính tiêu chuẩn sau, thường được gọi bằng từ viết tắt ACID –
Trong MySQL, các giao dịch bắt đầu bằng câu lệnh BEGIN WORK và kết thúc bằng câu lệnh CAM KẾT hoặc ROLLBACK. Các lệnh SQL giữa các câu lệnh bắt đầu và kết thúc tạo thành phần lớn giao dịch CAM KẾT và QUAY LẠIHai từ khóa Cam kết và Khôi phục chủ yếu được sử dụng cho Giao dịch MySQL
Bạn có thể kiểm soát hành vi của giao dịch bằng cách đặt biến phiên có tên là AUTOCOMMIT. Nếu AUTOCOMMIT được đặt thành 1 (mặc định), thì mỗi câu lệnh SQL (trong một giao dịch hoặc không) được coi là một giao dịch hoàn chỉnh và được cam kết theo mặc định khi nó kết thúc Khi AUTOCOMMIT được đặt thành 0, bằng cách phát lệnh SET AUTOCOMMIT = 0, chuỗi câu lệnh tiếp theo hoạt động giống như một giao dịch và không có hoạt động nào được thực hiện cho đến khi một câu lệnh CAM KẾT rõ ràng được đưa ra Bạn có thể thực thi các lệnh SQL này trong PHP bằng cách sử dụng hàm mysql_query() Một ví dụ chung về giao dịchChuỗi sự kiện này độc lập với ngôn ngữ lập trình được sử dụng. Đường dẫn logic có thể được tạo bằng bất kỳ ngôn ngữ nào bạn sử dụng để tạo ứng dụng của mình Bạn có thể thực thi các lệnh SQL này trong PHP bằng cách sử dụng hàm mysql_query()
Các loại bảng an toàn giao dịch trong MySQLBạn không thể sử dụng giao dịch trực tiếp, nhưng đối với một số trường hợp ngoại lệ, bạn có thể. Tuy nhiên, chúng không an toàn và đảm bảo. Nếu bạn dự định sử dụng các giao dịch trong lập trình MySQL của mình, thì bạn cần tạo các bảng của mình theo một cách đặc biệt. Có nhiều loại bảng hỗ trợ giao dịch, nhưng phổ biến nhất là InnoDB Hỗ trợ cho các bảng InnoDB yêu cầu một tham số biên dịch cụ thể khi biên dịch MySQL từ nguồn. Nếu phiên bản MySQL của bạn không có hỗ trợ InnoDB, hãy yêu cầu Nhà cung cấp dịch vụ Internet của bạn xây dựng phiên bản MySQL có hỗ trợ cho các loại bảng InnoDB hoặc tải xuống và cài đặt Bản phân phối nhị phân MySQL-Max cho Windows hoặc Linux/UNIX và làm việc với loại bảng trong Nếu cài đặt MySQL của bạn hỗ trợ các bảng InnoDB, chỉ cần thêm định nghĩa TYPE = InnoDB vào câu lệnh tạo bảng Ví dụ: đoạn mã sau tạo một bảng InnoDB có tên là tcount_tbl − root@host# mysql -u root -p password; Enter password:******* mysql> use TUTORIALS; Database changed mysql> create table tcount_tbl -> ( -> tutorial_author varchar(40) NOT NULL, -> tutorial_count INT -> ) TYPE = InnoDB; Query OK, 0 rows affected (0.05 sec) Để biết thêm chi tiết về InnoDB, bạn có thể nhấp vào liên kết sau −InnoDB Bạn có thể sử dụng các loại bảng khác như GEMINI hoặc BDB, nhưng tùy thuộc vào cài đặt của bạn, nó có hỗ trợ hai loại bảng này hay không
Một giao dịch là một đơn vị logic của công việc chứa một hoặc nhiều câu lệnh SQL. Giao dịch là đơn vị nguyên tử của công việc có thể được cam kết hoặc khôi phục. Khi một giao dịch thực hiện nhiều thay đổi đối với cơ sở dữ liệu, tất cả các thay đổi đều thành công khi giao dịch được thực hiện hoặc tất cả các thay đổi sẽ được hoàn tác khi giao dịch được khôi phục Một giao dịch bắt đầu với câu lệnh SQL thực thi đầu tiên. Một giao dịch kết thúc khi nó được cam kết hoặc khôi phục, rõ ràng bằng câu lệnh CAM KẾT hoặc ROLLBACK hoặc hoàn toàn khi sử dụng DDL (Ngôn ngữ định nghĩa dữ liệu (DDL) để quản lý cấu trúc bảng và chỉ mục cũng như các câu lệnh CREATE, ALTER, RENAME, DROP và TRUNCATE nội dung Tìm hiểu khái niệm giao dịch Để hiểu khái niệm về giao dịch, hãy xem xét cơ sở dữ liệu ngân hàng. Giả sử một khách hàng của ngân hàng chuyển tiền từ tài khoản tiết kiệm (SB a/c) sang tài khoản hiện tại (CA a/c), sao kê sẽ được chia thành bốn khối
Câu lệnh SQL để ghi nợ SB a/c như sau CẬP NHẬT sb_accounts Câu lệnh SQL để ghi có OD a/c như sau CẬP NHẬT ca_accounts Câu lệnh SQL để ghi vào nhật ký giao dịch như sau CHÈN VÀO GIÁ TRỊ tạp chí Câu lệnh SQL cho Giao dịch kết thúc như sau CAM KẾT CÔNG VIỆC; MySQL và Mô hình ACID ACID (Nguyên tử, Tính nhất quán, Cách ly, Độ bền) là một tập hợp các thuộc tính đảm bảo rằng các giao dịch cơ sở dữ liệu được xử lý một cách đáng tin cậy. Trong MySQL, công cụ lưu trữ InnoDB hỗ trợ các tính năng tuân thủ ACID. Các phần sau thảo luận về cách các tính năng của MySQL, cụ thể là công cụ lưu trữ InnoDB, tương tác với các danh mục của mô hình ACID nguyên tử. Khía cạnh nguyên tử của mô hình ACID chủ yếu liên quan đến các giao dịch InnoDB. Các tính năng MySQL liên quan bao gồm
Tính nhất quán. Khía cạnh tính nhất quán của mô hình ACID chủ yếu liên quan đến quá trình xử lý InnoDB nội bộ để bảo vệ dữ liệu khỏi sự cố. Các tính năng MySQL liên quan bao gồm
Sự cô lập. Khía cạnh cách ly của mô hình ACID chủ yếu liên quan đến các giao dịch InnoDB, cụ thể là mức độ cách ly áp dụng cho từng giao dịch. Các tính năng MySQL liên quan bao gồm
Độ bền. Khía cạnh độ bền của mô hình ACID liên quan đến các tính năng phần mềm MySQL tương tác với cấu hình phần cứng cụ thể của bạn. Do có nhiều khả năng tùy thuộc vào khả năng của CPU, mạng và thiết bị lưu trữ của bạn, khía cạnh này là phức tạp nhất để đưa ra các hướng dẫn cụ thể cho. Các tính năng MySQL liên quan bao gồm
Giao dịch MySQL MySQL (ở đây chúng tôi duy trì phiên bản 5. 6) hỗ trợ các giao dịch cục bộ (trong một phiên khách hàng nhất định) thông qua các câu lệnh như SET tự động cam kết, BẮT ĐẦU GIAO DỊCH, CAM KẾT và ROLLBACK. Đây là cú pháp BẮT ĐẦU GIAO DỊCH, CAM KẾT và ROLLBACK START TRANSACTION transaction_characteristic [, transaction_characteristic] ...] transaction_characteristic: WITH CONSISTENT SNAPSHOT | READ WRITE | READ ONLY BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1} Những tuyên bố này cung cấp quyền kiểm soát đối với việc sử dụng các giao dịch
Theo mặc định, MySQL chạy với chế độ autocommit được bật. Điều này có nghĩa là ngay sau khi bạn thực hiện một câu lệnh cập nhật (sửa đổi) một bảng, MySQL sẽ lưu trữ bản cập nhật trên đĩa để làm cho nó tồn tại vĩnh viễn. Thay đổi không thể được khôi phục Hiện tại (theo mặc định), MySQL chạy với chế độ autocommit được bật mysql> select * from student_mast; +------------+------------------+----------+ | STUDENT_ID | NAME | ST_CLASS | +------------+------------------+----------+ | 2 | Neena Kochhar | 9 | | 3 | Lex De Haan | 9 | | 4 | Alexander Hunold | 11 | +------------+------------------+----------+ 3 rows in set (0.09 sec) Hãy thực hiện một lệnh cập nhật mysql>mysql> UPDATE STUDENT_MAST SET ST_CLASS=8 WHERE STUDENT_ID=2; Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql>mysql> select * from student_mast; +------------+------------------+----------+ | STUDENT_ID | NAME | ST_CLASS | +------------+------------------+----------+ | 2 | Neena Kochhar | 8 | | 3 | Lex De Haan | 9 | | 4 | Alexander Hunold | 11 | +------------+------------------+----------+ 3 rows in set (0.00 sec) Bây giờ hãy thực hiện lệnh ROLLBACK để quay lại giai đoạn trước mysql>mysql> ROLLBACK; Query OK, 0 rows affected (0.03 sec) mysql>mysql> select * from student_mast; +------------+------------------+----------+ | STUDENT_ID | NAME | ST_CLASS | +------------+------------------+----------+ | 2 | Neena Kochhar | 8 | | 3 | Lex De Haan | 9 | | 4 | Alexander Hunold | 11 | +------------+------------------+----------+ 3 rows in set (0.00 sec) Không có khôi phục khi MySQL chạy với chế độ tự động xác nhận được bật Để tắt chế độ tự động cam kết, hãy sử dụng câu lệnh BẮT ĐẦU GIAO DỊCH. Xem ví dụ sau mysql>mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE STUDENT_MAST SET ST_CLASS=10 WHERE STUDENT_ID=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from student_mast; +------------+------------------+----------+ | STUDENT_ID | NAME | ST_CLASS | +------------+------------------+----------+ | 2 | Neena Kochhar | 10 | | 3 | Lex De Haan | 9 | | 4 | Alexander Hunold | 11 | +------------+------------------+----------+ 3 rows in set (0.00 sec) mysql> ROLLBACK; Query OK, 0 rows affected (0.07 sec) mysql> select * from student_mast; +------------+------------------+----------+ | STUDENT_ID | NAME | ST_CLASS | +------------+------------------+----------+ | 2 | Neena Kochhar | 8 | | 3 | Lex De Haan | 9 | | 4 | Alexander Hunold | 11 | +------------+------------------+----------+ 3 rows in set (0.00 sec) Các câu lệnh MySQL không thể Roll Back và các câu lệnh gây ra Cam kết ngầm Trong MySQL, một số câu lệnh không thể được khôi phục. Các câu lệnh DDL chẳng hạn như cơ sở dữ liệu CREATE hoặc DROP, các bảng CREATE, ALTER hoặc DROP hoặc các thủ tục được lưu trữ. Bạn nên thiết kế một giao dịch không có những câu lệnh này Các câu lệnh được liệt kê trong phần này (và bất kỳ từ đồng nghĩa nào với chúng) hoàn toàn kết thúc bất kỳ giao dịch nào đang hoạt động trong phiên hiện tại, như thể bạn đã thực hiện CAM KẾT trước khi thực hiện câu lệnh
SAVEPOINT, QUAY LẠI VỀ SAVEPOINT và PHÁT HÀNH SAVEPOINT InnoDB hỗ trợ các câu lệnh SQL SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT và từ khóa WORK tùy chọn cho ROLLBACK Câu lệnh SAVEPOINT đặt điểm lưu trữ giao dịch được đặt tên với tên của mã định danh. Nếu giao dịch hiện tại có một điểm lưu trữ có cùng tên, thì điểm lưu trữ cũ sẽ bị xóa và một điểm lưu trữ mới được đặt Câu lệnh ROLLBACK TO SAVEPOINT khôi phục giao dịch về điểm lưu trữ được đặt tên mà không chấm dứt giao dịch. Các sửa đổi mà giao dịch hiện tại được thực hiện đối với các hàng sau khi đặt điểm lưu trữ sẽ được hoàn tác trong quá trình khôi phục, nhưng InnoDB không giải phóng các khóa hàng được lưu trữ trong bộ nhớ sau điểm lưu trữ Đây là cú pháp SAVEPOINT identifier ROLLBACK [WORK] TO [SAVEPOINT] identifier RELEASE SAVEPOINT identifier Bảng KHÓA và MỞ KHÓA MySQL cho phép các phiên máy khách có được các khóa bảng một cách rõ ràng nhằm mục đích hợp tác với các phiên khác để truy cập vào các bảng hoặc để ngăn các phiên khác sửa đổi các bảng trong các khoảng thời gian khi một phiên yêu cầu quyền truy cập độc quyền vào chúng. Một phiên chỉ có thể lấy hoặc giải phóng các khóa cho chính nó. Một phiên không thể lấy khóa cho phiên khác hoặc giải phóng khóa do phiên khác nắm giữ LOCK TABLES có được các khóa bảng một cách rõ ràng cho phiên máy khách hiện tại. Khóa bảng có thể được mua cho các bảng cơ sở hoặc dạng xem. Bạn phải có đặc quyền LOCK TABLES và đặc quyền CHỌN cho từng đối tượng được khóa UNLOCK TABLES giải phóng rõ ràng bất kỳ khóa bảng nào do phiên hiện tại nắm giữ. LOCK TABLES hoàn toàn giải phóng bất kỳ khóa bảng nào được giữ bởi phiên hiện tại trước khi có được các khóa mới Làm cách nào để kiểm tra xem autocommit có được bật trong MySQL không?Để xác định trạng thái hiện tại của chế độ tự động cam kết, hãy sử dụng lệnh SQL SELECT @@autocommit .
Giao dịch có phải là bảng khóa không?Khái niệm giao dịch và khóa là khác nhau. Tuy nhiên, giao dịch đã sử dụng khóa để giúp giao dịch tuân theo các nguyên tắc ACID . Nếu bạn muốn bảng ngăn người khác đọc/ghi cùng lúc khi bạn đang đọc/ghi, bạn cần có khóa để thực hiện việc này.
Bế tắc trong MySQL là gì?Bế tắc là tình huống trong đó các giao dịch khác nhau không thể tiến hành vì mỗi giao dịch giữ một khóa mà giao dịch kia cần . Bởi vì cả hai giao dịch đều đang đợi một tài nguyên có sẵn, nên không bao giờ giải phóng các khóa mà nó đang nắm giữ.
Làm cách nào để bật CAM KẾT tự động trong MySQL?Để sử dụng giao dịch nhiều câu lệnh, tắt chế độ tự động cam kết bằng câu lệnh SQL SET autocommit = 0 và kết thúc mỗi giao dịch bằng CAM KẾT hoặc ROLLBACK dưới dạng . Để bật chế độ tự động cam kết, hãy bắt đầu mỗi giao dịch bằng START TRANSACTION và kết thúc bằng CAM KẾT hoặc ROLLBACK. |