大约30个并发线程/用户同时运行时出现此问题。
JDBC连接配置的设置如下:自动提交设置为false。事务隔离设置为TRANSACTION_READ_UNCOMMITTED(根据内部应用程序设置)
对父级和子级的JDBC请求被/应该被 Package 在单个事务中,并且应该被原子地提交。针对单用户/线程进行了测试,它工作正常,并以原子方式提交父事务和子事务。
在调试过程中,注意到父记录首先插入事务中,但随后的子记录插入失败,通过以下查询给出外键引用错误。
**以下查询在SSMS中运行,以跟踪JMeter中运行负载测试期间的插入和事务
设置事务隔离级别读取未提交; SELECT * FROM PARENT_TABLE WHERE ID = NEW_ID;--返回一条记录
SELECT * FROM CHILD_TABLE WHERE ID = NEW_ID;--返回一条记录
过了一会儿
设置事务隔离级别读取未提交; SELECT * FROM PARENT_TABLE WHERE ID = NEW_ID;--无记录
SELECT * FROM CHILD_TABLE WHERE ID = NEW_ID;--无记录
有时,它会插入一个或两个子记录,但由于相同的外键引用错误而无法插入后续子记录。
运行SQL跟踪错误日志,异常,死锁图,锁定获取,锁定释放,锁定超时,但没有线索出了什么问题。
为JDBC采样器添加了常数计时器,以延迟插入到子对象但没有进度。此外,在父表中插入记录时延迟了父采样器,但没有进展。
有人能帮帮我吗?
我尝试复制运行期间产生的脚本Jmeter,并首先插入父记录,然后通过SSMS插入失败的子记录,它工作得很好,没有任何失败。
在运行JMeter时,它应该以相同的方式工作,而没有任何外键引用问题
2条答案
按热度按时间w3nuxt5m1#
1.我认为设置事务隔离的正确方法不是通过SQL,而是通过JDBC连接配置:
1.对于“Commit”也是一样,默认情况下JMeter会立即提交JDBC Request语句,如果你想批量运行它们,你应该将“Auto Commit”设置为
False
,并使用单独的JDBC Request采样器执行提交:更多信息:Using JDBC Sampler in JMeter
ybzsozfc2#
问题现已解决。这是由于受控的吞吐量,这最终减慢了整个过程,即每个请求采样器执行之间的延迟。启动事务、插入Header、插入行和最后提交的总执行时间大约为42秒。当延迟减少到30秒以下时,它开始运行良好。我需要做的就是让它跑得更快,而不是慢下来。