近來在做sybase的性能調試,發現我啟動多線程的時候,線程會處于lock sleeping。 剛開始還以為是數據庫不支持并發訪問,后來想想真幼稚。。原來是我在做并發插入數據的時候,該表的鎖設置為全頁加鎖了。 后來設置為數據行鎖,這樣才可以執行并發操作的測試。 但是后面又遇到一個問題,就是out of lock的問題,也就是ASE設置的鎖不夠用。如果是在windows下的話,可以用ASE的補助工具修改number of locks來增加更多的鎖,因為設置的是數據行鎖,所以,在執行Insert的時候,如果不提交事物的話,就會每一條數據加一個鎖。。在增加鎖的時候,必須要增加內存,也就是增加max memory。。大概一個鎖占據的內存是120byte。 如果是在Linux系統的話,就修改“服務名.cfg“文件。
1、全頁鎖(allpages lock) 對查詢的表及索引頁加鎖,也就是table lock
2、頁鎖 (data lock) 對所查詢的結果所在頁加鎖,對索引不加鎖
3、行鎖 (row lock) 對某行數據加鎖
sybase除非對配置參數加以特定,對所有的表都予置了隱含的全頁面加鎖機制。
sp_configure ‘lock scheme’, [allpages | datapages | datarows]
當數據庫從原先版本的服務器中轉儲出來重新加載時,所有的表都被定義為全頁面加鎖的表。當建立一個新表時,可以不使用這個缺省值,可采用如下的句法格式:
create table <tablename>;… lock [allpages | datapages | datarows]
為了在使用的一個表中改變加鎖類型,可以采用如下的句法格式:
alter table <tablename>; lock [allpages | datapages | datarows]