近来在做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]