注册

多进程并发初始化库失败怎么解决?

随风 2024/03/19 515 4

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8开发版
【驱动版本】:8.1.3.62
【操作系统】:debian 12
【CPU】: x86_64
【问题描述】*:为了避免多个进程同时初始化数据库,每个进程在初始化数据库前,需要先获取一个锁,初始化完成后再释放锁。我的问题是怎么获取这个锁?

我使用的是 go 语言,sqlx 读写数据库,由于 sqlx 官方默认不支持达梦数据库,就参考github上的 maxnilz/migrate 写了个插件让 sqlx 支持达梦。其中获取锁使用如下的 SQL:

declare v_lockhandle varchar2(200); v_result number; begin dbms_lock.allocate_unique('control_lock', v_lockhandle); v_result := dbms_lock.request(v_lockhandle, dbms_lock.x_mode); if v_result <> 0 then dbms_output.put_line( case when v_result=1 then 'Timeout' when v_result=2 then 'Deadlock' when v_result=3 then 'Parameter Error' when v_result=4 then 'Already owned' when v_result=5 then 'Illegal Lock Handle' end); end if; end;

这段代码在 DM管理工具中是可以运行的,但使用达梦驱动执行就报错:

try lock failed in line 0 details: Error -2007: 第 2 行, 第 51 列[]附近出现错误: 语法分析出错 stack info: 1). dm.(*dm_build_421).dm_build_454 /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/zq.go:723 2). dm.(*dm_build_421).dm_build_410 /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/zq.go:710 3). dm.(*dm_build_421).dm_build_413 /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/zq.go:764 4). dm.(*dm_build_2).dm_build_42 /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/a.go:267 5). dm.(*dm_build_2).Dm_build_70 /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/a.go:358 6). dm.(*dm_build_2).Dm_build_88 /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/a.go:379 7). dm.(*DmConnection).executeInner /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/m.go:203 8). dm.(*DmConnection).execContext /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/m.go:610 9). dm.(*filterChain).DmConnectionExecContext /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/zd.go:149 10). dm.(*reconnectFilter).DmConnectionExecContext /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/zf.go:235 11). dm.(*filterChain).DmConnectionExecContext /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/zd.go:146 12). dm.(*DmConnection).ExecContext /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/driver/m.go:306 13). database/sql.ctxDriverExec /home/zhuyadong/data/tools/go/src/database/sql/ctxutil.go:31 14). database/sql.(*DB).execDC.func2 /home/zhuyadong/data/tools/go/src/database/sql/sql.go:1675 15). database/sql.withLock /home/zhuyadong/data/tools/go/src/database/sql/sql.go:3405 16). database/sql.(*DB).execDC /home/zhuyadong/data/tools/go/src/database/sql/sql.go:1670 17). database/sql.(*Conn).ExecContext /home/zhuyadong/data/tools/go/src/database/sql/sql.go:1982 18). gws/infr/database/driver/dameng.(*Oracle).Lock /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/dameng.go:190 19). gws/infr/database/driver/dameng.(*Oracle).ensureVersionTable /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/dameng.go:362 20). gws/infr/database/driver/dameng.WithInstance /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng/dameng.go:103 21). gws/infr/database/driver.(*DbDaMeng).Driver /home/zhuyadong/data/aias/v3/common/40-server/gws/infr/database/driver/dameng.go:42
回答 0
暂无回答
扫一扫
联系客服