database - Sybase 批量插入死锁

标签 database exception deadlock sybase sap-ase

我正在使用 ASE 15.0.3,并且在尝试在表中执行批量插入(通过 sql 查询而不是存储过程)时,Java 进程有时会抛出异常。以下是异常(exception): JZ0BE:BatchUpdateException:执行批处理语句时出错:您的服务器命令(系列 ID #0,进程 ID #61)遇到死锁情况。请重新运行您的命令。

它试图插入的表有很多列,但在 id (int identity) 列上只有一个(非聚集)索引。

与此表交互的其他(并发)进程可以执行以下两件事之一:

1) Select data from the table (transaction based)

2) Delete data from the table (transaction based, and first requiring an 
exclusive table lock with wait 20 sec).

预感是死锁来自索引页。无法将锁定机制转换为数据页或数据行,因为该表包含许多大的可变字符列,所有这些列加起来超过 8191 字节并且它显示:... 超过 8191 字节的限制用于 DOL 表中可变长度列的列偏移量。以后对该表的插入可能会失败。

关于如何避免这种情况的任何想法? (除了从表中删除索引)。

谢谢

最佳答案

首先 - 你有 table 上的触发器吗?如果是 - 检查触发器中的所有表。 您对该表使用哪种锁模式?如果它是所有页面锁 - 尝试将其更改为数据页/数据行。 关于行大小限制的异常(exception) - 我认为你应该调查拆分表或更改表结构的可能性......

关于database - Sybase 批量插入死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17545356/

相关文章:

php - Mysql 表关系/外键?

c# - 静态构造函数中的异常

java - 如何正确让多个线程访问共享缓冲区

database - 包含搜索

php - 如何在数据库中查找与输入字符串最相似的字符串

php - yii2:抛出新异常的正确方法

c# - 如果在运行任务之前创建新的表单实例,则等待任务会挂起

C++ 终止调用,没有事件异常

java - 如何为 Web 应用程序实现缓存

c++ - 如何在 C++ 中正确实现我自己的异常处理程序