0 Khóa toàn bộ cơ sở dữ liệu SQLite3 trong khi cập nhật

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi phải cập nhật cơ sở dữ liệu SQLite3, nó sẽ bỏ một bảng, tạo lại nó và sau đó sao chép lại bảng. Tôi muốn đảm bảo tất cả các quy trình khác của mình khi truy cập cơ sở dữ liệu phải chờ giao dịch hoàn tất để tránh sẵn sàng từ một bảng trống /thiếu tiềm năng.

Tại thời điểm này, mã của tôi là như thế này:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

Trong khi điều này hoạt động, tôi không chắc chắn tôi thực sự khóa DB. Tôi đã tìm thấy một số thông tin mâu thuẫn trên mạng có đề cập đến 'BEGIN TRANSACTION EXCLUSIVE' vs 'BEGIN TRANSACTION'.

Ai đó có thể giải thích loại giao dịch nào tôi cần để đảm bảo không có lần đọc nào khác thành công trong khi tôi đã khóa nó không?

    
- 1
  1. Câu hỏi quá rộng vì câu trả lời phụ thuộc gần như hoàn toàn vào hoàn cảnh cụ thể của bạn. Bạn đang kết nối trong chế độ WAL? LOCKING_MODE là mặc định hay độc quyền? SHARED_CACHE_MODE có được bật không? Mức cô lập của các kết nối khác có "đọc không cam kết" hay không? Quá nhiều chi tiết.
    2019-05-08 17: 11: 09Z
  2. Tôi thực sự không biết gì về các quy trình khác (cách chúng được viết). Tôi đang cố gắng cập nhật cơ sở dữ liệu từ dòng lệnh bash, sử dụng .sql mà tôi đã tạo. Tôi muốn đảm bảo các quy trình khác không phàn nàn về một bảng bị thiếu /trống. Vì vậy, tôi muốn tệp MY .sql khóa cơ sở dữ liệu một cách thích hợp
    2019-05-08 18: 08: 27Z
  3. Với cài đặt thông thường, khóa ghi sẽ được lấy cho bảng thả và không được phát hành cho đến khi cam kết. Không có kết nối khác có thể có được một khóa cho đến lúc đó. Nhưng nếu bạn có nhiều kết nối tranh giành khóa ghi thường xuyên, bạn nên sử dụng một cơ sở dữ liệu khác. Rất nhiều độc giả và đôi khi là nhà văn, có thể là chế độ Wal.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - bản cập nhật này không thường xuyên nên không sao. Tôi không có quyền kiểm soát cài đặt SQLite (vì vậy tôi không thể sửa đổi cài đặt như chế độ WAL.) Vì vậy, tôi đã hy vọng có một câu trả lời đơn giản như sử dụng "BEGIN TRANSACTION XXX"
    2019-05-09 00: 12: 19Z
0 Câu trả lời                              0                         
nguồn đặt đây
Những câu hỏi khác
1
Làm thế nào để loại bỏ Lv:
yêu cầu 1 tháng trước
0
AWK Kết hợp nhiều lệnh [đã đóng]
yêu cầu 1 tháng trước