工具庫的使用:程序編寫時#include <庫名.h>即可調用庫中的函數 編譯時鏈接工具庫;
注意:數據庫中不區分字母大小寫;
SQLite 中的事務是數據庫操作中非常重要的一個概念,它用于確保數據庫操作的完整性和一致性。以下是關于 SQLite 中事務的詳細介紹:
1. 事務的基本概念
事務是一組數據庫操作的集合,這些操作要么全部成功,要么全部失敗。在事務執行過程中,如果任何一個操作失敗,那么整個事務都會被撤銷,數據庫會恢復到事務開始之前的狀態。事務具有以下四個特性(ACID):
- 原子性(Atomicity):事務中的所有操作要么全部執行,要么全部不執行。
- 一致性(Consistency):事務執行前后,數據庫的狀態都必須滿足完整性約束。
- 隔離性(Isolation):多個事務并發執行時,一個事務的執行不會被其他事務干擾。
- 持久性(Durability):一旦事務提交,其對數據庫的更改就會被永久保存。
2. 事務的使用
在 SQLite 中,事務的使用主要通過 SQL 語句來控制。以下是事務的基本操作:
(1)開始事務
使用 BEGIN TRANSACTION
或 BEGIN
語句來開始一個事務。例如:
BEGIN TRANSACTION;
或者
BEGIN;
這兩個語句的效果是相同的,都表示開始一個新的事務。
(2)提交事務
如果事務中的所有操作都成功執行,可以使用 COMMIT
語句來提交事務,將事務中的更改永久保存到數據庫中。例如:
COMMIT;
提交事務后,事務中的所有更改都會被寫入數據庫。
(3)回滾事務
如果事務中的某個操作失敗,可以使用 ROLLBACK
語句來回滾事務,撤銷事務中的所有更改,使數據庫恢復到事務開始之前的狀態。例如:
ROLLBACK;
回滾事務后,事務中的所有操作都不會對數據庫產生影響。
3. 事務的隔離級別
SQLite 支持以下幾種事務隔離級別:
- READ UNCOMMITTED(讀未提交):允許一個事務讀取另一個事務未提交的數據。這種隔離級別下,可能會出現臟讀、不可重復讀和幻讀的問題。
- READ COMMITTED(讀已提交):一個事務只能讀取另一個事務已經提交的數據。這種隔離級別下,不會出現臟讀,但可能會出現不可重復讀和幻讀。
- REPEATABLE READ(可重復讀):一個事務在讀取數據時,其他事務不能對這些數據進行修改,直到當前事務完成。這種隔離級別下,不會出現臟讀和不可重復讀,但可能會出現幻讀。
- SERIALIZABLE(可串行化):這是最高的隔離級別,事務之間完全隔離,不會出現任何并發問題。但這種隔離級別下的性能開銷最大。
SQLite 默認的隔離級別是 SERIALIZABLE
,但可以通過設置 PRAGMA read_uncommitted
來改變隔離級別。例如:
PRAGMA read_uncommitted = 1; -- 設置為 READ UNCOMMITTED
4. 自動提交模式
SQLite 默認是自動提交模式(autocommit mode)。在這種模式下,每條單獨的 SQL 語句都會自動開啟一個事務,并在執行完成后自動提交事務。例如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
在自動提交模式下,這條 INSERT
語句會自動開啟一個事務,執行完成后自動提交。
如果需要手動控制事務,可以通過執行 BEGIN TRANSACTION
或 BEGIN
語句來關閉自動提交模式。關閉自動提交模式后,需要手動提交或回滾事務。例如:
BEGIN TRANSACTION;
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
COMMIT;
5. 事務的注意事項
- 事務的嵌套:SQLite 不支持嵌套事務。如果在事務中再執行
BEGIN TRANSACTION
,會報錯。 - 鎖機制:在事務執行過程中,SQLite 會使用鎖機制來保證數據的一致性。鎖的類型包括共享鎖(shared lock)和排他鎖(exclusive lock)。共享鎖允許多個事務同時讀取數據,但不允許修改;排他鎖則允許一個事務獨占數據,其他事務不能讀取或修改。
- 性能影響:事務的使用會對數據庫性能產生一定的影響。頻繁地開啟和提交事務會增加系統的開銷,因此在實際應用中需要合理控制事務的使用。
6. 示例
以下是一個使用事務的完整示例:
-- 開始事務
BEGIN TRANSACTION;-- 插入數據
INSERT INTO students (name, age) VALUES ('Alice', 20);
INSERT INTO students (name, age) VALUES ('Bob', 22);-- 更新數據
UPDATE students SET age = 21 WHERE name = 'Alice';-- 提交事務
COMMIT;
如果在事務執行過程中出現任何錯誤,可以使用 ROLLBACK
來回滾事務,撤銷所有更改。
通過合理使用事務,可以確保數據庫操作的完整性和一致性,提高數據庫系統的可靠性。
主鍵:
- 唯一的標識一行(一張表中只能有一個主鍵)
- 主鍵應該說對用戶沒有意義的(常用于索引)
- 永遠不要更新主鍵,否則違反用戶沒有意義原則
- 主鍵不應包含動態變化的數據,如時間戳、創建時間列、修改時間列等
- 主鍵應當有計算機自動生成(保證唯一性)
唯一約束:
- 用來保證一個列(或一組列)中數據唯一,類似于主鍵,但跟主鍵有區別
- 表可以包含多個唯一約束,但只允許一個主鍵
- 唯一約束列可修改或更新
- 創建表時可通過unique來設置
檢查約束: - 用來保證一個列(或一組列)中的數據滿足一組指定的條件
- 指定范圍,檢查最大或最小范圍,通過check實現
視圖不包含數據,因此在每次使用視圖時,實際上都必須執行查詢語句
視圖相當于創建視圖的時候as后面的SQL語句查詢得到的結果集合
從返會結果信息(視圖)中再檢索視圖與表一樣
索引是為了在大數據庫中,實現搜索、查找、條件查找等
索引避免使用情況:
表的數據量不大
表的大部分操作不是查詢
大量出現NULL值的情況
C程序調用sqlite3接口;