sơ bộ:MySQL: Các giao dịch trên nhiều chủ đề
Tôi có một ứng dụng mà duy trì một hồ bơi thread khoảng 100 bài. Mỗi luồng có thể kéo dài khoảng 1-30 giây trước khi tác vụ mới thay thế nó. Khi một luồng kết thúc, luồng đó sẽ hầu như luôn dẫn đến việc chèn 1-3 bản ghi vào một bảng, bảng này được sử dụng bởi tất cả các luồng. Ngay bây giờ, không có hỗ trợ giao dịch tồn tại, nhưng tôi đang cố gắng để thêm rằng bây giờ. Ngoài ra, bảng được đề cập là InnoDB. Vì vậy, ...
Goal
Tôi muốn thực hiện một giao dịch cho việc này. Các quy tắc cho hay không giao dịch này cam kết hoặc rollback cư trú trong chủ đề chính. Về cơ bản có một hàm đơn giản sẽ trả về một boolean.
- Tôi có thể triển khai giao dịch trên nhiều kết nối không?
- Nếu không, có thể có nhiều chuỗi chia sẻ cùng một kết nối không? (Lưu ý: có rất nhiều chèn chèn ở đây, và đó là một yêu cầu).
Có lẽ, tôi nghĩ rằng tôi có thể suy nghĩ lại điều này bằng cách chỉ cần chờ chủ đề trên bài kiểm tra của chủ đề chính để hoàn thành trước khi bắt đầu. – Zombies
Chỉ là một ý nghĩ, không kiểm tra điều đó: nếu bạn thực hiện các hàm 'start_transaction()' và 'commit()'/'rollback()' của riêng mình, và bạn khóa một mutex trong 'start_transaction()' và mở khóa nó trên giao dịch cuối cùng, các giao dịch sẽ an toàn hơn nhiều để sử dụng trong các chủ đề. Tôi không nói rằng nó sẽ hoạt động như một kết nối khác. Nó chỉ là đôi khi bạn bắt đầu giao dịch trong các chủ đề và bạn dựa vào chúng là nguyên tử. Cũng lưu ý rằng mysql sais rằng chỉ có một truy vấn tại một thời điểm nên chạy trong tất cả các luồng. Điều đó bao gồm từ chạy truy vấn để hoàn tất tìm nạp kết quả. – NickSoft
Thông tin liên lạc qua kết nối cần phải được tuần tự hóa. Một cách tiếp cận là phải có một chuỗi giao tiếp chuyên dụng và có các luồng khác làm bất cứ công việc nào là cần thiết, sau đó chuyển các kết quả lên đến luồng giao tiếp, mà nối tiếp các câu lệnh. –