论坛徽章: 0
20 可用积分
在数据库里建一表 bepsszfxh ,建表语句如下:
[leshy@leshy ~]$ oncheck -pt leshydb1:bepsszfxh
TBLspace Report for leshydb1:leshy.bepsszfxh
Physical Address 1:12986
Creation date 02/18/2009 05:24:22
TBLspace Flags 802 Row Locking
TBLspace use 4 bit bit-maps
Maximum row size 36
Number of special columns 0
Number of keys 0
Number of extents 1
Current serial value 1
First extent size 16
Next extent size 16
Number of pages allocated 16
Number of pages used 2
Number of data pages 1
Number of rows 30
Partition partnum 1049008
Partition lockid 1049008
Extents
Logical Page Physical Page Size
0 1:13219 16
[leshy@leshy ~]$ cat bepsszfxh.sql
{ TABLE "leshy".bepsszfxh row size = 36 number of columns = 4 index size = 0 }
create table "leshy".bepsszfxh
(
zl char(2) not null ,
jgm char(10) not null ,
xh integer not null ,
memo char(20) not null
) extent size 32 next size 32 lock mode row;
revoke all on "leshy".bepsszfxh from "public";
[leshy@leshy ~]$
从以上两点可以看出来它是行锁的。然后我写程序如下:
[ leshy@leshy test ] $ cat locktest. ec
# include < stdio. h>
char grs_errmsg[ 128] ;
main( argc, argv )
int argc;
char * argv[ ] ;
{
EXEC SQL BEGIN DECLARE SECTION;
char lds_dbname[ 20] ;
long ldl_count;
EXEC SQL END DECLARE SECTION;
int lri_ret= 0;
perror ( "开始" ) ;
memset ( lds_dbname , 0 , sizeof ( lds_dbname) ) ;
memset ( grs_errmsg , 0 , sizeof ( grs_errmsg) ) ;
strcpy ( lds_dbname, "leshydb1" ) ;
EXEC SQL DATABASE : lds_dbname;
EXEC SQL BEGIN WORK;
perror ( "开始事务!" ) ;
EXEC SQL SET LOCK MODE TO WAIT 4;
EXEC SQL select xh INTO : ldl_count from bepsszfxh where zl = 21;
printf ( "EXEC SQL select xh from bepsszfxh where zl = 21;result[%d]" , ldl_count) ;
EXEC SQL LOCK TABLE bepsszfxh IN EXCLUSIVE MODE ;
perror ( "EXEC SQL LOCK TABLE bepsszfxh IN EXCLUSIVE MODE ;" ) ;
EXEC SQL UPDATE bepsszfxh SET xh= xh+ 1 where zl = 21;
perror ( "EXEC SQL UPDATE bepsszfxh SET xh=xh+1 where zl = 21;" ) ;
EXEC SQL UNLOCK TABLE bepsszfxh;
perror ( "EXEC SQL UNLOCK TABLE bepszsfzh" ) ;
perror ( "这里没有提交事务,看有没有把表释放" ) ;
sleep ( 1000) ;
EXEC SQL COMMIT WORK;
EXEC SQL CLOSE DATABASE ;
return 0;
}
[ leshy@leshy test ] $
测试如下。执行生成的 locktest程序
[leshy@leshy test]$ locktest 开始: Success 开始事务!: Success
EXEC SQL LOCK TABLE bepsszfxh IN EXCLUSIVE MODE ;: Success
EXEC SQL UPDATE bepsszfxh SET xh=xh+1 where zl = 21;: Success
EXEC SQL UNLOCK TABLE bepszsfzh: Success
这里没有提交事务,看有没有把表释放: Illegal seek
然后改一个窗口打开dbaccess 去查询这个表的其它行:select * from bepsszfxh where zl=22; 复制代码 执行结果提示
244: Could not do a physical-order read to fetch next row.
113: ISAM error: the file is locked.
我不知道是不是还有什么需要设置的。我用的Informix版本是
IBM Informix Dynamic Server Version 9.40.UC8 -- On-Line -- Up 00:11:48 -- 29416 Kbytes
操作系统是
Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
同样的程序我在 AIX 5.2 + Informix 7.3下试也不行。
不知道这个该怎么解决了。还请高手指教。
我来回答