Tôi đã thực hiện một số truy vấn mà không có cam kết. Sau đó, ứng dụng đã bị dừng.
Làm cách nào để hiển thị các giao dịch đang mở này và cam kết hoặc hủy bỏ chúng?
Tôi đã thực hiện một số truy vấn mà không có cam kết. Sau đó, ứng dụng đã bị dừng.
Làm cách nào để hiển thị các giao dịch đang mở này và cam kết hoặc hủy bỏ chúng?
Câu trả lời:
Làm cách nào để hiển thị các giao dịch đang mở này và cam kết hoặc hủy bỏ chúng?
Không có giao dịch mở nào, MySQL sẽ khôi phục giao dịch khi ngắt kết nối.
Bạn không thể thực hiện giao dịch (IFAIK).
Bạn hiển thị các chuỗi bằng cách sử dụng
SHOW FULL PROCESSLIST
Xem: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html
Nó sẽ không giúp ích cho bạn, bởi vì bạn không thể thực hiện một giao dịch từ một kết nối bị hỏng.
Điều gì xảy ra khi ngắt kết nối
Từ tài liệu MySQL: http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html
4.5.1.6.3. Tắt tự động kết nối lại mysql
Nếu máy khách mysql mất kết nối với máy chủ trong khi gửi câu lệnh, nó sẽ ngay lập tức và tự động cố gắng kết nối lại một lần với máy chủ và gửi lại câu lệnh. Tuy nhiên , ngay cả khi mysql kết nối lại thành công, kết nối đầu tiên của bạn đã kết thúc và tất cả các đối tượng và cài đặt phiên trước đó của bạn bị mất : bảng tạm thời, chế độ tự động gửi và các biến phiên và do người dùng xác định. Ngoài ra, bất kỳ giao dịch hiện tại nào cũng sẽ quay trở lại .
Hành vi này có thể nguy hiểm cho bạn, chẳng hạn như trong ví dụ sau khi máy chủ bị tắt và khởi động lại giữa câu lệnh thứ nhất và thứ hai mà bạn không biết:
Xem thêm: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
Cách chẩn đoán và khắc phục sự cố này
Để kiểm tra tự động kết nối lại:
Nếu kết nối lại tự động xảy ra (ví dụ: do kết quả của việc gọi mysql_ping ()), thì không có dấu hiệu rõ ràng về điều đó. Để kiểm tra kết nối lại, hãy gọi
mysql_thread_id()
để lấy mã nhận dạng kết nối ban đầu trước khi gọimysql_ping()
, sau đó gọimysql_thread_id()
lại để xem mã nhận dạng có thay đổi hay không.
Đảm bảo rằng bạn giữ truy vấn cuối cùng của mình (giao dịch) trong ứng dụng khách để bạn có thể gửi lại nếu cần.
Và tắt chế độ tự động kết nối lại, vì điều đó rất nguy hiểm, thay vào đó hãy triển khai kết nối lại của riêng bạn để bạn biết khi nào xảy ra sụt giảm và bạn có thể gửi lại truy vấn đó.
mysqld.dll
AKA Và bạn giữ câu lệnh SQL có chứa toàn bộ giao dịch trong bộ nhớ để bạn có thể phát lại khi kết nối bị ngắt. Hoặc bạn giữ nó cục bộ trên đĩa, để khi khởi động lại, bạn có thể gửi lại.
Mặc dù sẽ không có bất kỳ giao dịch nào còn lại trong trường hợp, như @Johan đã nói, bạn có thể xem danh sách giao dịch hiện tại trong InnoDB với truy vấn bên dưới nếu muốn.
SELECT * FROM information_schema.innodb_trx\G
Từ tài liệu :
Bảng INNODB_TRX chứa thông tin về mọi giao dịch (không bao gồm giao dịch chỉ đọc) hiện đang thực thi bên trong InnoDB, bao gồm cả giao dịch có đang chờ khóa hay không, giao dịch bắt đầu khi nào và câu lệnh SQL mà giao dịch đang thực hiện, nếu có.
\G
sửa đổi ở cuối chỉ hữu ích nếu bạn muốn định dạng đầu ra truy vấn trong công cụ mysql CLI. Nếu bạn sử dụng công cụ GUI như Mysql Workbench, bạn không cần nó.
Bạn có thể sử dụng show innodb status
(hoặc show engine innodb status
đối với các phiên bản mới hơn của mysql) để nhận danh sách tất cả các hành động hiện đang chờ xử lý bên trong công cụ InnoDB. Bị chôn vùi trong bức tường đầu ra sẽ là các giao dịch và ID quy trình nội bộ mà chúng đang chạy.
Bạn sẽ không thể buộc thực hiện cam kết hoặc khôi phục các giao dịch đó, nhưng bạn CÓ THỂ giết quá trình MySQL đang chạy chúng, về cơ bản quá trình này sẽ dẫn đến việc khôi phục. Nó giết chết kết nối của các tiến trình và khiến MySQL dọn dẹp mớ hỗn độn còn lại của nó.
Đây là những gì bạn muốn tìm kiếm:
------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx's n:o < 0 134992 undo n:o < 0 0
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624
MySQL thread id 10594, query id 10269885 localhost marc
show innodb status
Trong trường hợp này, chỉ có một kết nối với công cụ InnoDB ngay bây giờ (thông tin đăng nhập của tôi, đang chạy show
truy vấn). Nếu dòng đó là một kết nối thực tế / giao dịch bị kẹt mà bạn muốn chấm dứt, thì bạn thực hiện một kill 10594
.
show engine innodb status
?
Liệt kê tất cả:
SHOW FULL PROCESSLIST
nếu bạn muốn loại bỏ một id giao dịch, hãy sao chép giao dịch và hủy giao dịch bằng cách sử dụng lệnh này:
KILL <id> // e.g KILL 16543