當前位置:首頁 » 數據倉庫 » 怎樣設置一個資料庫鎖定
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

怎樣設置一個資料庫鎖定

發布時間: 2022-09-27 20:13:13

A. 如何對Mysql資料庫表進行鎖定

如果兩個程序都向表中寫數據顯然會造成很大的麻煩,甚至會有意外情況發生。如果表正由一個程序寫入,同時進行讀取的另一個程序也會產生混亂的結果。本文主要講述。鎖定表的方法防止客戶機的請求互相干擾或者伺服器與維護程序相互干擾的方法主要有多種。如果你關閉資料庫,就可以保證伺服器和myisamchk和 isamchk之間沒有交互作用。但是停止伺服器的運行並不是一個好注意,因為這樣做會使得沒有故障的資料庫和表也不可用。本節主要討論的過程,是避免伺服器和myisamchk或isamchk之間的交互作用。實現這種功能的方法是對表進行鎖定。伺服器由兩種表的鎖定方法:1.內部鎖定內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的SELECT查詢被另一個客戶機的UPDATE查詢所干擾。也可以利用內部鎖定機制防止伺服器在利用myisamchk或isamchk檢查或修復表時對表的訪問。語法:鎖定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]解鎖表:UNLOCK TABLESLOCK TABLES為當前線程鎖定表。UNLOCK TABLES釋放被當前線程持有的任何鎖。當線程發出另外一個LOCK TABLES時,或當伺服器的連接被關閉時,當前線程鎖定的所有表自動被解鎖。如果一個線程獲得在一個表上的一個READ鎖,該線程(和所有其他線程)只能從表中讀。如果一個線程獲得一個表上的一個WRITE鎖,那麼只有持鎖的線程READ或WRITE表,其他線程被阻止。每個線程等待(沒有超時)直到它獲得它請求的所有鎖。WRITE鎖通常比READ鎖有更高的優先順序,以確保更改盡快被處理。這意味著,如果一個線程獲得READ鎖,並且然後另外一個線程請求一個WRITE鎖, 隨後的READ鎖請求將等待直到WRITE線程得到了鎖並且釋放了它。顯然對於檢查,你只需要獲得讀鎖。再者鍾情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對於修復,你必須獲得些所以防止任何客戶機在你對表進行操作時修改它。2.外部鎖定伺服器還可以使用外部鎖定(文件級鎖)來防止其它程序在伺服器使用表時修改文件。通常,在表的檢查操作中伺服器將外部鎖定與myisamchk或 isamchk作合使用。但是,外部鎖定在某些系統中是禁用的,因為他不能可靠的進行工作。對運行myisamchk或isamchk所選擇的過程取決於伺服器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協議。 如果伺服器用--skip-locking選項運行,則外部鎖定禁用。該選項在某些系統中是預設的,如linux。可以通過運行mysqladmin variables命令確定伺服器是否能夠使用外部鎖定。檢查skip_locking變數的值並按以下方法進行:◆ 如果skip_locking為off,則外部鎖定有效您可以繼續並運行人和一個實用程序來檢查表。伺服器和實用程序將合作對表進行訪問。但是,運行任何一個實用程序之前,應該使用mysqladmin flush-tables。為了修復表,應該使用表的修復鎖定協議。◆ 如果skip_locaking為on,則禁用外部鎖定,所以在myisamchk或isamchk檢查修復表示伺服器並不知道,最好關閉伺服器。如果堅持是伺服器保持開啟狀態,月確保在您使用此表示沒有客戶機來訪問它。必須使用卡黨的鎖定協議告訴伺服器是該表不被其他客戶機訪問。檢查表的鎖定協議本節只介紹如果使用表的內部鎖定。對於檢查表的鎖定協議,此過程只針對表的檢查,不針對表的修復。1.調用mysql發布下列語句:$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES; 該鎖防止其它客戶機在檢查時寫入該表和修改該表。FLUSH語句導致伺服器關閉表的文件,它將刷新仍在告訴緩存中的任何為寫入的改變。2.執行檢查過程$myisamchk tbl_name$ isamchk tbl_name 3.釋放表鎖mysql>UNLOCK TABLES; 如果myisamchk或isamchk指出發現該表的問題,將需要執行表的修復。修復表的鎖定協議這里只介紹如果使用表的內部鎖定。修復表的鎖定過程類似於檢查表的鎖定過程,但有兩個區別。第一,你必須得到寫鎖而非讀鎖。由於你需要修改表,因此根本不允許客戶機對其進行訪問。第二,必須在執行修復之後發布FLUSH TABLE語句,因為myisamchk和isamchk建立的新的索引文件,除非再次刷新改表的高速緩存,否則伺服器不會注意到這個改變。本例同樣適合優化表的過程。1.調用mysql發布下列語句:$mysql –u root –p db_namemysql>LOCK TABLE tbl_name WRITE;mysql>FLUSH TABLES; 2.做數據表的拷貝,然後運行myisamchk和isamchk:$cp tbl_name.* /some/other/dir$myisamchk --recover tbl_name$ isamchk --recover tbl_name --recover選項只是針對安裝而設置的。這些特殊選項的選擇將取決與你執行修復的類型。

B. 如何對行 表 資料庫加鎖

1
如何鎖一個表的某一行

SET TRANSACTION
ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM table ROWLOCK WHERE id = 1

2 鎖定資料庫的一個表

SELECT * FROM table WITH (HOLDLOCK)

加鎖語句:
sybase:
update 表 set col1=col1 where 1=0
;
MSSQL:
select col1 from 表 (tablockx)
where
1=0
;
oracle:
LOCK TABLE 表 IN EXCLUSIVE MODE ;

加鎖後其它人不可操作,直到加鎖用戶解鎖,用commit或rollback解鎖

幾個例子幫助大家加深印象

設table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3

1)排它鎖
新建兩個連接
在第一個連接中執行以下語句
begin tran
update table1

set
A='aa'
where B='b2'
waitfor delay
'00:00:30' --等待30秒
commit tran

在第二個連接中執行以下語句
begin tran
select * from table1

where B='b2'
commit tran

若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行即要等待30秒

2)共享鎖
在第一個連接中執行以下語句
begin tran
select * from table1
holdlock
-holdlock人為加鎖
where B='b2'
waitfor delay
'00:00:30' --等待30秒
commit tran

在第二個連接中執行以下語句
begin tran
select A,C
from
table1
where B='b2'
update table1

set
A='aa'
where B='b2'
commit tran

若同時執行上述兩個語句,則第二個連接中的select查詢可以執行
而update必須等待第一個事務釋放共享鎖轉為排它鎖後才能執行
即要等待30秒

3)死鎖
增設table2(D,E)
D E
d1 e1
d2 e2

在第一個連接中執行以下語句
begin tran
update table1

set
A='aa'
where B='b2'
waitfor delay
'00:00:30'
update table2

set
D='d5'
where E='e1'
commit tran

在第二個連接中執行以下語句
begin tran
update table2

set
D='d5'
where E='e1'
waitfor delay
'00:00:10'
update table1

set
A='aa'
where B='b2'
commit tran

同時執行,系統會檢測出死鎖,並中止進程

補充一點:
Sql Server2000支持的表級鎖定提示

HOLDLOCK 持有共享鎖,直到整個事務完成,應該在被鎖對象不需要時立即釋放,等於SERIALIZABLE事務隔離級別

NOLOCK 語句執行時不發出共享鎖,允許臟讀 ,等於 READ
UNCOMMITTED事務隔離級別

PAGLOCK 在使用一個表鎖的地方用多個頁鎖

READPAST 讓sql
server跳過任何鎖定行,執行事務,適用於READ UNCOMMITTED事務隔離級別只跳過RID鎖,不跳過頁,區域和表鎖

ROWLOCK
強制使用行鎖

TABLOCKX 強制使用獨占表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表

UPLOCK
強制在讀表時使用更新而不用共享鎖

應用程序鎖:
應用程序鎖就是客戶端代碼生成的鎖,而不是sql server本身生成的鎖

處理應用程序鎖的兩個過程

sp_getapplock 鎖定應用程序資源

sp_releaseapplock
為應用程序資源解鎖

注意: 鎖定資料庫的一個表的區別

SELECT * FROM table WITH (HOLDLOCK)
其他事務可以讀取表,但不能更新刪除

SELECT * FROM table WITH (TABLOCKX)
其他事務不能讀取表,更新和刪除

1
如何鎖一個表的某一行
/*
測試環境:windows 2K server + Mssql 2000

所有功能都進行測試過,並有相應的結果集,如果有什麼疑義在論壇跟帖

關於版權的說明:部分資料來自互聯網,如有不當請聯系版主,版主會在第一時間處理。

功能:sql遍歷文件夾下的文本文件名,當然你修改部分代碼後可以完成各種文件的列表。
*/

A
連接中執行

SET TRANSACTION
ISOLATION LEVEL REPEATABLE
READ

begin tran

select * from tablename
with
(rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B連接中如果執行

update tablename set
colname='10' where id=3
--則要等待5秒

update tablename
set
colname='10' where id <>3
--可立即執行

2
鎖定資料庫的一個表

SELECT * FROM table WITH (HOLDLOCK)

注意: 鎖定資料庫的一個表的區別

SELECT * FROM table WITH (HOLDLOCK)

其他事務可以讀取表,但不能更新刪除

SELECT * FROM table WITH (TABLOCKX)

其他事務不能讀取表,更新和刪除

C. mysql資料庫怎麼設置樂觀鎖

樂觀鎖與悲觀鎖不同的是,它是一種邏輯上的鎖,而不需要資料庫提供鎖機制來支持
當數據很重要,回滾或重試一次需要很大的開銷時,需要保證操作的ACID性質,此時應該採用悲觀鎖
而當數據對即時的一致性要求不高,重試一次不太影響整體性能時,可以採用樂觀鎖來保證最終一致性,同時有利於提高並發性
通常,樂觀鎖採用版本號/時間戳的形式實現:給數據額外增加一個版本號欄位進行控制;更新時,若提交的數據所帶的版本號與當前記錄的版本號一致,則允許變更執行並更新版本號;若不一致,則意味著產生沖突,根據業務需求直接丟棄並返回失敗,或者嘗試合並
在MySQL的實踐中,常見的一種使用樂觀鎖的方法,是在需要使用樂觀鎖的表中,新增一個version欄位
例如:
create table proct_amount (
id int not null primary key auto_increment,
proct_name varchar(64) not null,
selling_amount int not null,
storing_amount int not null,
version int not null
);
當需要更新銷售中的商品數量(selling_amount)時,使用如下的SQL語句:
update proct_amount set selling_amount = #{selling_amount}, version = #{new_version} where id=#{id} and version = #{old_version};
若該語句返回1,則表示更新成功;若返回0,則表示前後的version不一致,產生沖突,更新失敗
對於更新倉庫中的商品數據(storing_amount)時,也是同理
不過,這樣為每行記錄都統一設置一個version欄位的樂觀鎖方式,存在一個問題:上例中,如果同時需要單獨對selling_amount及storing_amount進行update(兩條SQL語句分別單獨執行),那麼後執行的一條會因為先執行的一條更新了version欄位而失敗,而這種失敗顯然是沒有必要的,白白浪費了開銷
一種比較好的方式是為每個需要樂觀鎖的欄位單獨設置版本號,例如對上例的改造:
create table proct_amount (
id int not null primary key auto_increment,
proct_name varchar(64) not null,
selling_amount int not null,
selling_version int not null,
storing_amount int not null,
storing_version int not null
);
selling_amount和storing_amount分別擁有自己的樂觀鎖版本號(selling_version和storing_version),更新時分別只關注自己的版本號,這樣就不會因為版本號被其它欄位修改而失敗,提高了並發性

D. MySQL資料庫表鎖定的幾種方法實現

如果兩個程序都向表中寫數據顯然會造成很大的麻煩,甚至會有意外情況發生。如果表正由一個程序寫入,同時進行讀取的另一個程序也會產生混亂的結果。
鎖定表的方法
防止客戶機的請求互相干擾或者伺服器與維護程序相互干擾的方法主要有多種。如果你關閉資料庫,就可以保證伺服器
和myisamchk和isamchk之間沒有交互作用。但是停止伺服器的運行並不是一個好注意,因為這樣做會使得沒有故障的資料庫和表也不可用。本節主
要討論的過程,是避免伺服器和myisamchk或isamchk之間的交互作用。實現這種功能的方法是對表進行鎖定。
伺服器由兩種表的鎖定方法:
1.內部鎖定
內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的SELECT查詢被另一個客戶機的UPDATE查詢所干擾。也可以利用內部鎖定機制防止伺服器在利用myisamchk或isamchk檢查或修復表時對表的訪問。
語法:鎖定表:LOCK TABLES
tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]
解鎖表:UNLOCKTABLESLOCKTABLES為當前線程鎖定表。UNLOCK TABLES釋放被當前線程持有的任何鎖。當線程發出另外一個LOCK
TABLES時,或當伺服器的連接被關閉時,當前線程鎖定的所有表自動被解鎖。
如果一個線程獲得在一個表上的一個READ鎖,該線程(和所有其他線程)只能從表中讀。如果一個線程獲得一個表上的一個WRITE鎖,那麼只有持鎖的線程READ或WRITE表,其他線程被阻止。
每個線程等待(沒有超時)直到它獲得它請求的所有鎖。
WRITE鎖通常比READ鎖有更高的優先順序,以確保更改盡快被處理。這意味著,如果一個線程獲得READ鎖,並且然後另外一個線程請求一個WRITE鎖,
隨後的READ鎖請求將等待直到WRITE線程得到了鎖並且釋放了它。
顯然對於檢查,你只需要獲得讀鎖。再者鍾情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對於修復,你必須獲得些所以防止任何客戶機在你對表進行操作時修改它。
2.外部鎖定
伺服器還可以使用外部鎖定(文件級鎖)來防止其它程序在伺服器使用表時修改文件。通常,在表的檢查操作中伺服器
將外部鎖定與myisamchk或isamchk作合使用。但是,外部鎖定在某些系統中是禁用的,因為他不能可靠的進行工作。對運行myisamchk或
isamchk所選擇的過程取決於伺服器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協議。
如果伺服器用--skip-locking選項運行,則外部鎖定禁用。該選項在某些系統中是預設的,如Linux。可以通過運行mysqladmin
variables命令確定伺服器是否能夠使用外部鎖定。檢查skip_locking變數的值並按以下方法進行:

如果skip_locking為off,則外部鎖定有效您可以繼續並運行人和一個實用程序來檢查表。伺服器和實用程序將合作對表進行訪問。但是,運行任何
一個實用程序之前,應該使用mysqladmin flush-tables。為了修復表,應該使用表的修復鎖定協議。

如果skip_locaking為on,則禁用外部鎖定,所以在myisamchk或isamchk檢查修復表示伺服器並不知道,最好關閉伺服器。如果堅
持是伺服器保持開啟狀態,月確保在您使用此表示沒有客戶機來訪問它。

E. 如何設置資料庫的許可權

1、首先用管理員進入資料庫級中的安全性,點擊登錄名,點擊新建登錄名。



F. sql server怎樣給一個資料庫加鎖和解鎖

加鎖的語句如下:

1

SELECT * FROM 表名 WITH (TABLOCK);

這里沒有解鎖的概念,只有不加鎖的概念,語句如下:

1

SELECT * FROM 表名 WITH (NOLOCK);

加鎖的解釋:
TABLOCK(表鎖)
此選項被選中時,SQL Server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他進程只能讀取而不能修改數據。
不加鎖的解釋:
NOLOCK(不加鎖)
此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到

G. 如何對MySQL資料庫表進行鎖定

伺服器由兩種表的鎖定方法:

1.內部鎖定

內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的SELECT查詢被另一個客戶機的UPDATE查詢所干擾。也可以利用內部鎖定機制防止伺服器在利用myisamchk或isamchk檢查或修復表時對表的訪問。

語法:

鎖定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]

解鎖表:UNLOCK TABLES

LOCK TABLES為當前線程鎖定表。UNLOCK TABLES釋放被當前線程持有的任何鎖。當線程發出另外一個LOCK TABLES時,或當伺服器的連接被關閉時,當前線程鎖定的所有表自動被解鎖。

如果一個線程獲得在一個表上的一個READ鎖,該線程(和所有其他線程)只能從表中讀。如果一個線程獲得一個表上的一個WRITE鎖,那麼只有持鎖的線程READ或WRITE表,其他線程被阻止。

每個線程等待(沒有超時)直到它獲得它請求的所有鎖。

WRITE鎖通常比READ鎖有更高的優先順序,以確保更改盡快被處理。這意味著,如果一個線程獲得READ鎖,並且然後另外一個線程請求一個WRITE鎖, 隨後的READ鎖請求將等待直到WRITE線程得到了鎖並且釋放了它。

顯然對於檢查,你只需要獲得讀鎖。再者鍾情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對於修復,你必須獲得些所以防止任何客戶機在你對表進行操作時修改它。

2.外部鎖定

伺服器還可以使用外部鎖定(文件級鎖)來防止其它程序在伺服器使用表時修改文件。通常,在表的檢查操作中伺服器將外部鎖定與myisamchk或isamchk作合使用。但是,外部鎖定在某些系統中是禁用的,因為他不能可靠的進行工作。對運行myisamchk或isamchk所選擇的過程取決於伺服器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協議。
如果伺服器用--skip-locking選項運行,則外部鎖定禁用。該選項在某些系統中是預設的,如Linux。可以通過運行mysqladmin variables命令確定伺服器是否能夠使用外部鎖定。檢查skip_locking變數的值並按以下方法進行:


如果skip_locking為off,則外部鎖定有效您可以繼續並運行人和一個實用程序來檢查表。伺服器和實用程序將合作對表進行訪問。但是,運行任何一個實用程序之前,應該使用mysqladmin
flush-tables。為了修復表,應該使用表的修復鎖定協議。


如果skip_locaking為on,則禁用外部鎖定,所以在myisamchk或isamchk檢查修復表示伺服器並不知道,最好關閉伺服器。如果堅持是伺服器保持開啟狀態,月確保在您使用此表示沒有客戶機來訪問它。必須使用卡黨的鎖定協議告訴伺服器是該表不被其他客戶機訪問。

檢查表的鎖定協議

本節只介紹如果使用表的內部鎖定。對於檢查表的鎖定協議,此過程只針對表的檢查,不針對表的修復。

1.調用mysql發布下列語句:

$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES;

該鎖防止其它客戶機在檢查時寫入該表和修改該表。FLUSH語句導致伺服器關閉表的文件,它將刷新仍在告訴緩存中的任何為寫入的改變。

2.執行檢查過程

$myisamchk tbl_name$ isamchk tbl_name

3.釋放表鎖

mysql>UNLOCK TABLES;

如果myisamchk或isamchk指出發現該表的問題,將需要執行表的修復。

修復表的鎖定協議

這里只介紹如果使用表的內部鎖定。修復表的鎖定過程類似於檢查表的鎖定過程,但有兩個區別。第一,你必須得到寫鎖而非讀鎖。由於你需要修改表,因此根本不允許客戶機對其進行訪問。第二,必須在執行修復之後發布FLUSH

TABLE語句,因為myisamchk和isamchk建立的新的索引文件,除非再次刷新改表的高速緩存,否則伺服器不會注意到這個改變。本例同樣適合優化表的過程。

1.調用mysql發布下列語句:

$mysql –u root –p db_namemysql>LOCK TABLE tbl_name WRITE;mysql>FLUSH TABLES;

2.做數據表的拷貝,然後運行myisamchk和isamchk:

$cp tbl_name.* /some/other/dir$myisamchk --recover tbl_name$ isamchk --recover tbl_name

--recover選項只是針對安裝而設置的。這些特殊選項的選擇將取決與你執行修復的類型。

3.再次刷新高速緩存,並釋放表鎖:
mysql>FLUSH TABLES;mysql>UNLOCK TABLES;

H. 急用:ASP如何鎖定資料庫

RS.OPEN SQL,CONN,A,B 就是你用的rsTest.Open sql, Cnn, 1, 1

A:

ADOPENFORWARDONLY(=0)
只讀,且當前數據記錄只能向下移動

ADOPENKEYSET(=1)
只讀,當前數據記錄可自由移動

ADOPENDYNAMIC(=2)
可讀寫,當前數據記錄可自由移動

ADOPENSTATIC(=3)
可讀寫,當前數據記錄可自由移動,可看到新增記錄

B:

ADLOCKREADONLY(=1)
預設鎖定類型,記錄集是只讀的,不能修改記錄

ADLOCKPESSIMISTIC(=2)
悲觀鎖定,當修改記錄時,數據提供者將嘗試鎖定記錄以確保成功地編輯記錄。只要編輯一開始,則立即鎖住記錄。

ADLOCKOPTIMISTIC(=3)
樂觀鎖定 ,直到用Update方法提交更新記錄時才鎖定記錄。

ADLOCKBATCHOPTIMISTIC(=4)
批量樂觀鎖定,允許修改多個記錄,只有調用UpdateBatch方法後才鎖定記錄。

當不需要改動任何記錄時,應該使用只讀的記錄集,這樣提供者不用做任何檢測。
對於一般的使用,樂觀的鎖定可能是最好的選擇,因為記錄只被鎖定一小段時間,數據在這段時間被更新。這減少了資源的使用。

回樓主:
如果想只要編輯一開始,則立即鎖住記錄。的話 後面哪個 1 改成 2 就OK了啊。其實你給的代碼寫的是 1 那是只讀的,如果想寫資料庫,至少需要寫 2 或更大。

執行UPDATE 時資料庫就是鎖定的,你想不鎖定都不行的。

再不明白的話 Hi 我好了。

這個的話,SQL做不到的,你得在你的程序里寫個關閉,讓其他人不能打開相關頁面,只給他個提示才可以.

I. 如何鎖定ACCESS資料庫的窗體,不讓其它人修改

一般有三種方法保護ACCESS窗體
1)使用啟動窗體或自定義宏菜單(在ACCESS選項——啟動中設置),菜單——視圖——工具欄——取消對"資料庫"的勾選,——自定義,
取消勾選工具欄的勾選(自定義宏菜單除外,如果有的話),目的就是讓用戶看不到所有能更改資料庫對象設計方案的菜單、工具欄、命令圖標。但是這種方案很容易被破解,特別是對ACCESS資料庫有一定研究的用戶來說,盡管可以使用代碼禁止shift鍵,但是破解方案是可以在網上查到的;
2)設置工作組安全機制
菜單——工具——安全——設置工作組安全機制向導,跟隨向導指引設置,再設置不同用戶的許可權保護相關的資料庫對象。這個方案保護性能比較高,類似大型資料庫系統的用戶級保護機制,但是設置復雜而且分發使用也比較麻煩,另外2007以後版本不支持該手段;
3)生成編譯後的資料庫文件(.mde
2003版本、.accde
2007及以後版本)生成方法略...
這種方法保護最徹底,幾乎不存在破解的可能,但是一旦編譯後就不再可以被修改,源資料庫要小心保護好。