2012-06-08 10 views
5

Tôi không tìm thấy các lệnh khóa sqlite rõ ràng trước khi chèn hoặc cập nhật các hàng vào bảng. Liệu sqlite có xử lý cơ chế khóa trên nó không? Mô-đun máy nhắn tin được mô tả trong http://sqlite.org/lockingv3.html xử lý cơ chế khóa. Nhưng tôi không chắc chắn nếu có bất kỳ lệnh nào mà người dùng có thể sử dụng để khóa một cách rõ ràng các bảng. Làm ơn cho lời khuyên.Cơ chế khóa rõ ràng trong SQLite

Cảm ơn

Trả lời

12

Theo như tôi biết không có lệnh sqlite chuyên dụng để kiểm soát khóa. Tuy nhiên, bạn có thể lấy sqlite để khóa cơ sở dữ liệu bằng cách sử dụng create transaction. Ví dụ:

BEGIN IMMEDIATE TRANSACTION; 
... 
COMMIT TRANSACTION; 

BEGIN EXCLUSIVE TRANSACTION; 
... 
COMMIT TRANSACTION; 

Nếu bạn đọc tài liệu tôi liên kết bạn sẽ nhận được một ý tưởng tốt hơn về sự khác biệt giữa IMMEDIATE & EXCLUSIVE giao dịch. Có thể cần lưu ý rằng các khóa trong sqlite áp dụng cho toàn bộ cơ sở dữ liệu chứ không chỉ các bảng riêng lẻ, không giống như câu lệnh LOCK TABLE trong các cơ sở dữ liệu sql khác.

8

SQLite thực hiện bất kỳ khóa nào là cần thiết để thực hiện lược đồ giao dịch mà các câu lệnh SQL của bạn mô tả. Đặc biệt, nếu bạn không mô tả bất kỳ sau đó bạn sẽ có được hành vi tự động cam kết, với một khóa được tổ chức trong suốt thời gian của mỗi câu lệnh và sau đó giảm khi câu lệnh kết thúc. Nếu bạn cần giao dịch dài hơn (thường là đúng!) Thì bạn yêu cầu chúng một cách rõ ràng với BEGIN TRANSACTION (thường được rút ngắn thành BEGIN) và kết thúc bằng COMMIT TRANSACTION (hoặc ROLLBACK TRANSACTION). Việc xử lý giao dịch thường được bao bọc bởi giao diện ngôn ngữ của bạn (vì điều này làm cho nó dễ dàng hơn để lấy đúng, ghép nối tuổi thọ giao dịch với một khối mã hoặc gọi phương thức) nhưng ở cấp cơ sở, nó xuống đến BEGIN/COMMIT/ROLLBACK .

Tóm lại, bạn đã có giao dịch. Khóa được sử dụng để triển khai các giao dịch. Bạn không có ổ khóa thô (đó là một điều tốt; họ đang khó khăn hơn để có được quyền hơn bạn có thể nghĩ từ cái nhìn đầu tiên).