資源簡介
關鍵字: sqlite入門至精通
菜鳥入門
1。從www.sqlite.org 下載SQLite 3.3.4的版本
為了方便,我把它解壓了,就一個SQLite3.exe,放入Windows目錄下。
Cmd 進入命令行
1)
創建數據庫文件:
>SQLite3 d:\test.db 回車
就生成了一個test.db在d盤。
這樣同時也SQLite3掛上了這個test.db
2)
用.help可以看看有什么命令
>.help 回車即可
3)可以在這里直接輸入SQL語句創建表格 用;結束 ,然后回車就可以看到了
4)看看有創建了多少表
>.tables
5)看表結構
>.schema 表名
6)看看目前的數據庫
>.database
7)如果要把查詢輸出到文件
>.output 文件名
> 查詢語句;
查詢結果就輸出到了文件c:\query.txt
把查詢結果用屏幕輸出
>.output stdout
8)把表結構輸出,同時索引也會輸出
.dump 表名
9)退出
>.exit 或者.quit
2。從http://sqlite.phxsoftware.com/ 下載Ado.net驅動。
下載了安裝,在安裝目錄中存在System.Data.SQLite.dll
我們只需要拷貝這個文件到引用目錄,并添加引用即可對SQLite數據庫操作了
所有的Ado.net對象都是以SQLite開頭的,比如SQLiteConnection
連接串只需要如下方式
Data Source=d:\test.db 或者DataSource=test.db--應用在和應用程序或者.net能夠自動找到的目錄
剩下的就很簡單了~~
3。SQL語法
由于以前用SQLServer或者ISeries,所以DDL的語法很汗顏
1)創建一個單個Primary Key的table
CREATE TABLE [Admin] (
[UserName] [nvarchar] (20) PRIMARY KEY NOT NULL ,
[Password] [nvarchar] (50) NOT NULL ,
[Rank] [smallint] NOT NULL ,
[MailServer] [nvarchar] (50) NOT NULL ,
[MailUser] [nvarchar] (50) NOT NULL ,
[MailPassword] [nvarchar] (50) NOT NULL ,
[Mail] [nvarchar] (50) NOT NULL
) ;
2)創建一個多個Primary Key的table
CREATE TABLE [CodeDetail] (
[CdType] [nvarchar] (10) NOT NULL ,
[CdCode] [nvarchar] (20) NOT NULL ,
[CdString1] [ntext] NOT NULL ,
[CdString2] [ntext] NOT NULL ,
[CdString3] [ntext] NOT NULL,
PRIMARY KEY (CdType,CdCode)
) ;
3)創建索引
CREATE INDEX [IX_Account] ON [Account]([IsCheck], [UserName]);
還可以視圖等等。
4.還有很有用的SQL
Select * from Sqlite_master
Select datetime('now')
Select date('now')
Select time('now')
SQLite 內建函數表
算術函數 |
|
abs(X) |
返回給定數字表達式的絕對值。 |
max(X,Y[,...]) |
返回表達式的最大值。 |
min(X,Y[,...]) |
返回表達式的最小值。 |
random(*) |
返回隨機數。 |
round(X[,Y]) |
返回數字表達式并四舍五入為指定的長度或精度。 |
字符處理函數 |
|
length(X) |
返回給定字符串表達式的字符個數。 |
lower(X) |
將大寫字符數據轉換為小寫字符數據后返回字符表達式。 |
upper(X) |
返回將小寫字符數據轉換為大寫的字符表達式。 |
substr(X,Y,Z) |
返回表達式的一部分。 |
randstr() |
|
quote(A) |
|
like(A,B) |
確定給定的字符串是否與指定的模式匹配。 |
glob(A,B) |
|
條件判斷函數 |
|
coalesce(X,Y[,...]) |
|
ifnull(X,Y) |
|
nullif(X,Y) |
|
集合函數 |
|
avg(X) |
返回組中值的平均值。 |
count(X) |
返回組中項目的數量。 |
max(X) |
返回組中值的最大值。 |
min(X) |
返回組中值的最小值。 |
sum(X) |
返回表達式中所有值的和。 |
其他函數 |
|
typeof(X) |
返回數據的類型。 |
last_insert_rowid() |
返回最后插入的數據的 ID 。 |
sqlite_version(*) |
返回 SQLite 的版本。 |
change_count() |
返回受上一語句影響的行數。 |
last_statement_change_count() |
|
oh,還有就是看到有人說,好像成批插入的時候,啟動事務,比不啟動事務快n倍
還有就是盡量使用參數化的SQL,估計和商用DB一樣能夠自動Prepare.
===========
sqlite可以在shell/dos command底下直接執行命令:
sqlite3 film.db "select * from film;"
輸出 HTML 表格:
sqlite3 -html film.db "select * from film;"
將數據庫「倒出來」:
sqlite3 film.db ".dump" > output.sql
利用輸出的資料,建立一個一模一樣的數據庫(加上以上指令,就是標準的SQL數據庫備份了):
sqlite3 film.db < output.sql
在大量插入資料時,你可能會需要先打這個指令:
begin;
插入完資料后要記得打這個指令,資料才會寫進數據庫中:
commit;
SQLITE深入------常見問題
如何建立自動增長字段?
簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會自動增長 。
長一點的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那么, 每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數,如果表是空的, 將會是1。 (如果是最大可能的主鍵 9223372036854775807,那個,將鍵值將是隨機未使用的數。) 如,有下列表:
CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
);
在該表上,下列語句
INSERT INTO t1 VALUES(NULL,123);
在邏輯上等價于:
INSERT INTO t1 VALUES((SELECT max(a) FROM t1) 1,123);
有一個新的API叫做 sqlite3_last_insert_rowid(), 它將返回最近插入的整數值。 注意該整數會比表中該列上的插入之前的最大值大1。 該鍵值在當前的表中是唯一的。但有可能與已從表中刪除的值重疊。要想建立在整個表的生命周期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT聲明。那么,新的鍵值將會比該表中曾能存在過的最大值大1。如果最大可能的整數值在數據表中曾經存在過,INSERT將會失敗, 并返回SQLITE_FULL錯誤代碼。
多個應用程序或一個應用程序的多個實例可以同時訪問同一個數據庫文件嗎?
多個進程可同時打開同一個數據庫。多個進程可以同時進行SELECT 操作,但在任一時刻,只能有一個進程對數據庫進行更改。
SQLite使用讀、寫鎖控制對數據庫的訪問。(在Win95/98/ME等不支持讀、寫鎖的系統下,使用一個概率性的模擬來代替。)但使用時要注意: 如果數據庫文件存放于一個NFS文件系統上,這種鎖機制可能不能正常工作。 這是因為 fcntl() 文件鎖在很多NFS上沒有正確的實現。 在可能有多個進程同時訪問數據庫的時候,應該避免將數據庫文件放到NFS上。在Windows上,Microsoft的文檔中說:如果使用 FAT 文件系統而沒有運行 share.exe 守護進程,那么鎖可能是不能正常使用的。那些在Windows上有很多經驗的人告訴我:對于網絡文件,文件鎖的實現有好多Bug,是靠不住的。如果他們說的是對的, 那么在兩臺或多臺Windows機器間共享數據庫可能會引起不期望的問題。
我們意識到,沒有其它嵌入式的 SQL 數據庫引擎能象 SQLite 這樣處理如此多的并發。SQLite允許多個進程同時打開一個數據庫,同時讀一個數據庫。當有任何進程想要寫時,它必須在更新過程中鎖住數據庫文件。 但那通常只是幾毫秒的時間。其它進程只需等待寫進程干完活結束。典型地,其它嵌入式的SQL數據庫引擎同時只允許一個進程連接到數據庫。
但是,Client/Server數據庫引擎(如 PostgreSQL, MySQL, 或 Oracle)通常支持更高級別的并發,并且允許多個進程同時寫同一個數據庫。 這種機制在Client/Server結構的數據庫上是可能的,因為總是有一個單一的服務器進程很好地控制、協調對數據庫的訪問。如果你的應用程序需要很多的并發,那么你應該考慮使用一個Client/Server 結構的數據庫。但經驗表明,很多應用程序需要的并發,往往比其設計者所想象的少得多。
當SQLite試圖訪問一個被其它進程鎖住的文件時,缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數調整這一行為。
在SQLite數據庫中如何列出所有的表和索引?
如果你運行 sqlite3 命令行來訪問你的數據庫,可以鍵入 “.tables”來獲得所有表的列表。或者,你可以輸入 “.schema” 來看整個數據庫模式,包括所有的表的索引。 輸入這些命令,后面跟一個LIKE模式匹配可以限制顯示的表。
在一個 C/C 程序中(或者腳本語言使用 Tcl/Ruby/Perl/Python 等) 你可以在一個特殊的名叫 SQLITE_MASTER 上執行一個SELECT查詢以獲得所有 表的索引。每一個 SQLite 數據庫都有一個叫 SQLITE_MASTER 的表, 它定義數據庫的模式。 SQLITE_MASTER 表看起來如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
對于表來說,type 字段永遠是 'table',name 字段永遠是表的名字。所以,要獲得數據庫中所有表的列表, 使用下列SELECT語句:
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
對于索引,type 等于 'index', name 則是索引的名字,tbl_name 是該索引所屬的表的名字。 不管是表還是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 語句創建它們時的命令文本。對于自動創建的索引(用來實現 PRIMARY KEY 或 UNIQUE 約束),sql字段為NULL。
SQLITE_MASTER 表是只讀的。不能對它使用 UPDATE、INSERT 或 DELETE。 它會被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自動更新。
臨時表不會出現在 SQLITE_MASTER 表中。臨時表及其索引和觸發器存放在另外一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是對于創建那些臨時表的應用可見。如果要獲得所有表的列表, 不管是永久的還是臨時的,可以使用類似下面的命令:
SELECT name FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name
在SQLite中,VARCHAR字段最長是多少?
SQLite 不強制 VARCHAR 的長度。 你可以在 SQLITE 中聲明一個 VARCHAR(10),SQLite還是可以很高興地允許你放入500個字符。 并且這500個字符是原封不動的,它永遠不會被截斷。
SQLite支持二進制大對象嗎?
SQLite 3.0 及以后版本允許你在任何列中存儲 BLOB 數據。 即使該列被聲明為其它類型也可以。
在SQLite中,如何在一個表上添加或刪除一列?
SQLite 有有限地 ALTER TABLE 支持。你可以使用它來在表的末尾增加一列,可更改表的名稱。 如果需要對表結構做更復雜的改變,則必須重新建表。 重建時可以先將已存在的數據放到一個臨時表中,刪除原表, 創建新表,然后將數據從臨時表中復制回來。
如,假設有一個 t1 表,其中有 "a", "b", "c" 三列, 如果要刪除列 c ,以下過程描述如何做:
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
在數據庫中刪除了很多數據,但數據庫文件沒有變小,是Bug嗎?
不是。當你從SQLite數據庫中刪除數據時, 未用的磁盤空間將會加入一個內部的“自由列表”中。 當你下次插入數據時,這部分空間可以重用。磁盤空間不會丟失, 但也不會返還給操作系統。
如果刪除了大量數據,而又想縮小數據庫文件占用的空間,執行 VACUUM 命令。 VACUUM 將會從頭重新組織數據庫。這將會使用數據庫有一個空的“自由鏈表”, 數據庫文件也會最小。但要注意的是,VACUUM 的執行會需要一些時間(在SQLite開發時,在Linux上,大約每M字節需要半秒種),并且, 執行過程中需要原數據庫文件至多兩倍的臨時磁盤空間。
對于 SQLite 3.1版本,一個 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打開。
SQLITE_SCHEMA error是什么錯誤?為什么會出現該錯誤?
當一個準備好的(prepared)SQL語句不再有效或者無法執行時, 將返回一個 SQLITE_SCHEMA 錯誤。發生該錯誤時,SQL語句必須使用 sqlite3_prepare() API來重新編譯. 在 SQLite 3 中, 一個 SQLITE_SCHEMA 錯誤只會發生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 執行 SQL 時。而不會發生在使用 sqlite3_exec()時。 在版本2中不是這樣。
準備好的語句失效的最通常原因是:在語句準備好后, 數據庫的模式又被修改了。另外的原因會發生在:
數據庫離線:DETACHed.
數據庫被 VACUUMed
一個用戶存儲過程定義被刪除或改變。
一個 collation 序列定義被刪除或改變。
認證函數被改變。
在所有情況下,解決方法是重新編譯并執行該SQL語句。 因為一個已準備好的語句可以由于其它進程改變數據庫模式而失效, 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代碼都應準備處理 SQLITE_SCHEMA 錯誤。下面給出一個例子:
int rc;
sqlite3_stmt *pStmt;
char zSql[] = "SELECT .....";
do {
/* Compile the statement from SQL. Assume success. */
sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);
while( SQLITE_ROW==sqlite3_step(pStmt) ){
/* Do something with the row of available data */
}
/* Finalize the statement. If an SQLITE_SCHEMA error has
** occured, then the above call to sqlite3_step() will have
** returned SQLITE_ERROR. sqlite3_finalize() will return
** SQLITE_SCHEMA. In this case the loop will execute again.
*/
rc = sqlite3_finalize(pStmt);
} while( rc==SQLITE_SCHEMA );
如何在字符串中使用單引號(')?
SQL 標準規定,在字符串中,單引號需要使用逃逸字符,即在一行中使用兩個單引號。在這方面 SQL 用起來類似 Pascal 語言。 SQLite 尊循標準。如:
INSERT INTO xyz VALUES('5 O''clock');
Sqlite中如何返回本地化當前時間?
在做ClinicOS的時候遇到一個問題,在保存病歷登記時間時,我使用了“CURRENT_TIMESTAMP”,但這有個問題,它返回的是UTC Time,這對我們中國人沒啥用,一直希望能想辦法將它轉為localtime。今天剛好有空,所以去查了查Sqlite的Mail List,果然也有人遇到了這個問題,我從一篇名為《translate time comparison statement》(http://www.mail-archive.com/sqlite-users@sqlite.org /msg12350.html)中看到這樣的回復:
Mark Wyszomierski wrote:
You may want
WHERE julianday(date('now')) - julianday(date(arrival_date)) > 7
Mark,
You should still use the 'localtime' modifier on the 'now' value if your timestamps are local time since 'now' always returns UTC times.
WHERE julianday(date('now', 'localtime')) - julianday(date(arrival_date)) > 7
嘿嘿,看來如果想得到一個符合本機區域設置的當前時間,必須用date函數來轉換,
但date只函數只返回當前日期,而我需要的是返回當前日期及時間,所以這里把它換成datetime函數,即:
datetime(CURRENT_TIMESTAMP,'localtime')
以下是sqlite下測試的輸出信息:
sqlite> select CURRENT_TIMESTAMP;
2006-06-18 09:23:36
sqlite> select datetime(CURRENT_TIMESTAMP,'localtime');
2006-06-18 17:23:44
sqlite>
SQLITE分頁
剛開始的時候沒注意語法
后來才發現,原來用SQLite分頁是世界上最簡單的。
如果我要去11-20的Account表的數據
Select * From Account Limit 9 Offset 10;
以上語句表示從Account表獲取數據,跳過10行,取9行
嗯,我覺得這個特性足夠讓很多的web中型網站使用這個了。
也可以這樣寫 select * from account limit10,9和上面的的效果一樣。
這種寫法MySQL也支持。
SQLite不同于其他大部分的SQL數據庫引擎,因為它的首要設計目標就是簡單化:
易于管理
易于使用
易于嵌入其他大型程序
易于維護和配置
許多人喜歡SQLite因為它的小巧和快速. 但是這些特性只是它的部分優點, 使用者還會發現SQLite是非常穩定的. 出色的穩定性源于它的簡單, 越簡單就越不容易出錯. 除了上述的簡單、小巧和穩定性外, 最重要的在于SQLite力爭做到簡單化.
簡單化在一個數據庫引擎中可以說是一個優點, 但也可能是個缺點, 主要決定于你想要做什么. 為了達到簡單化, SQLite省略了一些人們認為比較有用的特性, 例如高并發性、嚴格的存取控制、 豐富的內置功能、 存儲過程、復雜的SQL語言特性、 XML以及Java的擴展, 超大的萬億級別的數據測量等等. 如果你需要使用上述的這些特性并且不介意它們的復雜性, 那么SQLite也許就不適合你了. SQLite沒有打算作為一個企業級的數據庫引擎, 也并不打算和Oracle或者PostgreSQL競爭.
僅憑經驗來說SQLite適用于以下場合: 當你更看中簡單的管理、使用和維護數據庫, 而不是那些企業級數據庫提供的不計其數的復雜功能的時候,使用SQLite是一個比較明智的選擇. 事實也證明, 人們在許多情況下已經清楚的認識到簡單就是最好的選擇.
SQLite最佳試用場合
網站
作為數據庫引擎SQLite適用于中小規模流量的網站(也就是說, 99.9%的網站). SQLite可以處理多少網站流量在于網站的數據庫有多大的壓力. 通常來說, 如果一個網站的點擊率少于100000次/天的話, SQLite是可以正常運行的. 100000次/天是一個保守的估計, 不是一個準確的上限. 事實證明, 即使是10倍的上述流量的情況下SQLite依然可以正常運行.
嵌入式設備和應用軟件
因為SQLite數據庫幾乎不需要管理, 因此對于那些無人值守運行或無人工技術支持的設備或服務, SQLite是一個很好的選擇. SQLite能很好的適用于手機, PDA, 機頂盒, 以及其他儀器. 作為一個嵌入式數據庫它也能夠很好的應用于客戶端程序.
應用程序文件格式
SQLite作為桌面應用程序的本地磁盤文件格式取得了巨大成功.例如金融分析工具、CAD 包、檔案管理程序等等. 一般的數據庫打開操作需要調用sqlite3_open()函數,并且標記一個顯式本地事務的起始點(BEGIN TRANSACTION)來保證以獨占的方式得到文件的內容. 文件保存將執行一個提交(COMMIT)同時標記另一個顯式本地事務起始點. 這種事務處理的作用就是保證對于應用程序數據文件的更新是原子的、持久的、獨立的和一致的.
數據庫里可以加入一些臨時的觸發器,用來把所有的改變記錄在一張臨時的取消/重做日志表中. 當用戶按下取消/重做按鈕的時候這些改變將可以被回滾. 應用這項技術實現一個無限級的取消/重做功能只需要編寫很少的代碼.
替代某些特別的文件格式
許多程序使用fopen(), fread(), 或 fwrite()函數創建和管理一些自定義的文件用來保存數據. 使用SQLite替代這些自定義的文件格式將是一種很好的選擇.
內部的或臨時的數據庫
對于那些有大量的數據需要用不同的方式篩選分類的程序, 相對于編寫同樣功能的代碼, 如果你把數據讀入一個內存中的SQLite數據庫, 然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數據, 通常會更簡單和快速. 按照上述的方法使用內嵌的SQLite數據庫將會使程序更富有靈活性, 因為添加新的列或索引不用重寫任何查詢語句.
命令行數據集分析工具
有經驗的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數據集. 原是數據可以從CSV(逗號分隔值文件)文件中導入, 然后被切分產生無數的綜合數據報告. 可能得用法包括網站日志分析, 運動統計分析, 編輯規劃標準, 分析試驗結果.
當然你也可以用企業級的客戶端/服務器數據庫來做同樣的事情. 在這種情況下使用SQLite的好處是: SQLite的部署更為簡單并且結果數據庫是一個單獨的文件, 你可以把它存儲在軟盤或者優盤或者直接通過email發給同事.
在Demo或測試版的時候作為企業級數據庫的替代品
如果你正在編寫一個使用企業級數據庫引擎的客戶端程序, 使用一個允許你連接不同SQL數據庫引擎的通用型數據庫后臺將是很有意義的. 其更大的意義在于將SQLite數據庫引擎靜態的連接到客戶端程序當中,從而內嵌SQLite作為混合的數據庫支持. 這樣客戶端程序就可以使用SQLite數據庫文件做獨立的測試或者驗證.
本文來自: (www.91linux.com) 詳細出處參考:http://www.91linux.com/html/article/database/sqlite/200812/12-14611.html
數據庫教學
因為SQLite的安裝和使用非常的簡單(安裝過程幾乎忽略不計, 只需要拷貝SQLite源代碼或sqlite.exe可執行文件到目標主機, 然后直接運行就可以) 所以它非常適合用來講解SQL語句. 同學們可以非常簡單的創建他們喜歡的數據庫, 然后通過電子郵件發給老師批注或打分. 對于那些感興趣怎樣實現一個關系型數據庫管理系統(RDBMS)的高層次的學生, 按照模塊化設計且擁有很好的注釋和文檔的SQLite源代碼, 將為他們打下良好的基礎. 這并不是說SQLite就是如何實現其他數據庫引擎的精確模型, 但是很適合學生們了解SQLite是如何快速工作的, 從而掌握其他數據庫系統的設計實現原則.
試驗SQL語言的擴展
SQLite簡單且模塊化的設計使得它可以成為一個用來測試數據庫語言特性或新想法的優秀的原型平臺.
哪些場合適合使用其他的關系型數據庫管理系統(RDBMS)
客戶端/服務器程序
如果你有許多的客戶端程序要通過網絡訪問一個共享的數據庫, 你應當考慮用一個客戶端/服務器數據庫來替代SQLite. SQLite可以通過網絡文件系統工作, 但是因為和大多數網絡文件系統都存在延時, 因此執行效率不會很高. 此外大多數網絡文件系統在實現文件邏輯鎖的方面都存在著bug(包括Unix 和windows). 如果文件鎖沒有正常的工作, 就可能出現在同一時間兩個或更多的客戶端程序更改同一個數據庫的同一部分, 從而導致數據庫出錯. 因為這些問題是文件系統執行的時候本質上存在的bug, 因此SQLite沒有辦法避免它們.
好的經驗告訴我們, 應該避免在許多計算機需要通過一個網絡文件系統同時訪問同一個數據庫的情況下使用SQLite.
高流量網站
SQLite通常情況下用作一個網站的后臺數據庫可以很好的工作. 但是如果你的網站的訪問量大到你開始考慮采取分布式的數據庫部署, 那么你應當毫不猶豫的考慮用一個企業級的客戶端/服務器數據庫來替代SQLite.
超大的數據集
當你在SQLite中開始一個事務處理的時候(事務處理會在任何寫操作發生之前產生, 而不是必須要顯示的調用BEGIN...COMMIT), 數據庫引擎將不得不分配一小塊臟頁(文件緩沖頁面)來幫助它自己管理回滾操作. 每1MB的數據庫文件SQLite需要256字節. 對于小型的數據庫這些空間不算什么, 但是當數據庫增長到數十億字節的時候, 緩沖頁面的尺寸就會相當的大了. 如果你需要存儲或修改幾十GB的數據, 你應該考慮用其他的數據庫引擎.
高并發訪問
SQLite對于整個數據庫文件進行讀取/寫入鎖定. 這意味著如果任何進程讀取了數據庫中的某一部分, 其他所有進程都不能再對該數據庫的任何部分進行寫入操作. 同樣的, 如果任何一個進程在對數據庫進行寫入操作, 其他所有進程都不能再讀取該數據庫的任何部分. 對于大多數情況這不算是什么問題. 在這些情況下每個程序使用數據庫的時間都很短暫, 并且不會獨占, 這樣鎖定至多會存在十幾毫秒. 但是如果有些程序需要高并發, 那么這些程序就需要尋找其他的解決方案了
代碼片段和文件信息
- 上一篇:圖片拖放
- 下一篇:easyui 工作流設計器設計 源碼
評論
共有 條評論