Mỗi lệnh bên trong serialize()
chức năng được đảm bảo để thúc thực hiện trước khi người tiếp theo bắt đầu.
Trong ví dụ của bạn, CREATE TABLE
sẽ kết thúc trước khi INSERT
được chạy. Nếu bạn không sử dụng serialize()
thì các tuyên bố CREATE TABLE
và INSERT
sẽ chạy song song. Họ sẽ bắt đầu quá nhanh sau khi một khác mà INSERT
thực sự có thể kết thúc trước khi bảng đã được tạo ra, cho bạn một lỗi về việc cố gắng chèn dữ liệu vào một bảng không tồn tại.
Điều này được gọi là điều kiện cuộc đua , bởi vì mỗi khi bạn chạy chương trình, bạn có thể nhận được một chiến thắng khác. Nếu CREATE TABLE
thắng cuộc đua thì chương trình sẽ hoạt động tốt. Nhưng nếu INSERT
thắng cuộc đua, chương trình sẽ bị lỗi. Vì bạn không thể kiểm soát ai thắng cuộc đua, serialize()
sẽ dừng lại INSERT
ngay cả khi bắt đầu cho đến khi CREATE TABLE
đã kết thúc, đảm bảo bạn nhận được kết quả tương tự mỗi lần.
Trong ví dụ thứ hai của bạn chỉ với một tuyên bố, thì vẫn cần serialize()
. Điều này là do run()
bắt đầu truy vấn SQL nhưng trả về ngay, để truy vấn chạy dưới nền. Vì lệnh tiếp theo của bạn là một trong số close()
cơ sở dữ liệu, bạn sẽ cắt nó trong khi truy vấn vẫn đang chạy.
Vì serialize()
không trả lại cho đến khi truy vấn nội bộ cuối cùng của nó hoàn tất, sử dụng nó sẽ giữ close()
cho đến khi truy vấn hoàn tất.
Nếu bạn đang sử dụng một loại truy vấn khác (nói để phản hồi người dùng nhấp vào nút trên trang web, nơi cơ sở dữ liệu được mở giữa các cuộc gọi) thì có thể bạn sẽ không cần serialize()
. Nó chỉ phụ thuộc vào việc mã sau mỗi truy vấn đòi hỏi rằng các truy vấn trước khi nó đã hoàn thành hay không.
Khi quyết định có sử dụng serialize()
hay không, có thể hữu ích khi nghĩ về bất kỳ truy vấn không được tuần tự hóa nào như thể chúng được nhận xét và sau đó xem mã vẫn hoạt động. Trong ví dụ đầu tiên của bạn ở trên, việc xóa lệnh CREATE TABLE
sẽ vi phạm câu lệnh INSERT
sau đây (vì sau đó sẽ không có bảng để chèn vào), do đó chúng cần phải được tuần tự hóa. Nhưng nếu bạn có hai lệnh CREATE TABLE
thì việc xóa một lệnh sẽ không ảnh hưởng đến lệnh kia, do đó hai lệnh này sẽ không phải được tuần tự hóa.
(Mẹo này không áp dụng cho close()
tuy nhiên - những quy tắc của ngón tay cái có chỉ gọi close()
khi mọi thứ đã kết thúc.)
Có lẽ một trong những lý do sau: http://stackoverflow.com/a/18899872/1936319 – Sizzler