Tôi bắt đầu một giao dịch, để chèn nhiều bản ghi vào một bảng. Tôi có thể chọn bản ghi được chèn mới nhất trong cơ sở dữ liệu trước khi giao dịch được cam kết không?trong sqlite3, có thể chọn thành công trong giao dịch chèn không?
Trả lời
Có.
Bên trong giao dịch, ứng dụng của bạn sẽ thấy mọi thứ.
Không có giao dịch nào khác, tuy nhiên, thấy bất kỳ phần nào của thay đổi.
Điểm của giao dịch là tạo một chuỗi các câu lệnh có vẻ là một thay đổi nguyên tử đối với cơ sở dữ liệu.
Nếu bạn cam kết, tất cả các tuyên bố trong giao dịch được hoàn tất và mọi người khác có thể thấy các hiệu ứng.
Nếu bạn quay trở lại, không có tuyên bố nào trong giao dịch được hoàn tất và không có thay đổi nào xảy ra với cơ sở dữ liệu.
Không phải tất cả các câu lệnh đều có thể là một phần của giao dịch, BTW. DDL (Tạo và Thả, ví dụ) sẽ kết thúc bất kỳ giao dịch trước đó nào.
Có, trong hoặc sau giao dịch bạn có thể sử dụng hàm last_insert_rowid().
Hàm last_insert_rowid() trả về ROWID của hàng cuối cùng được chèn từ kết nối cơ sở dữ liệu đã gọi hàm.
Nói cách khác:
SQLite version 3.6.23
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table T (C);
sqlite> insert into T values ('hello');
sqlite> select last_insert_rowid();
1
sqlite> BEGIN;
sqlite> insert into T values ('test 2');
sqlite> select last_insert_rowid();
2
sqlite> select rowid,* from T;
1|hello
2|test 2
sqlite> ROLLBACK;
sqlite> select last_insert_rowid();
2
sqlite> select rowid,* from T;
1|hello
sqlite>