lr_start_transaction_instance()
启动事务实例。
long lr_start_transaction_instance(const char * transaction_name,long handle);
参数说明:
transaction_name:事务的名称。
handle:父事务的句柄。值为0指示VuGen创建新的父事务。
lr_start_transaction_instance函数标记事务实例的开始。事务实例是具有transaction_name的事务的发生。实例通过其句柄来识别,其将它们与同一事务的其他实例区分开。
此函数允许创建事务的多个实例。当需要在不同情况下执行相同的事务并且需要对每种情况进行分析时,使用事务实例。
通过传递父事务实例的句柄,新实例将被认为是父事务的子事务实例。如果没有父对象,则传递零作为句柄。有关子事务的更多信息,请参阅lr_start_sub_transaction。
该函数返回标识实例的事务实例的句柄。请注意,每个lr_start_transaction_instance语句必须与lr_end_transaction_instance语句匹配,否则它将被解释为非法命令。
注意:不要在事务或子事务名称中使用句点字符(.)。句点字符分隔事务和子事务。在分析中,具有句点的事务名称将被解释为两个事务。
示例:lr_start_transaction_instance
实施例1:
在以下示例中,lr_start_transaction度量从银行服务器执行提款的事务的时间。一旦服务器API调用完成并向状态变量返回一个值,事务就完成了。然而,测试还希望验证如果客户超过提款限制,不成功提款交易将花费多长时间。为此,使用lr_start_transaction_instance创建事务“withdraw”的实例。
Long id;
int status;
int amount_overdrawn = get_amount_overdrawn(); / *调用服务器API * /
while(amount_overdrawn <LIMIT){
/ *通知事务正在启动* /
id = lr_start_transaction(“withdraw”);
status = bank_withdraw(500); / *调用服务器API * /
/ *结束事务与操作结果 - 通过或失败* /
if(status == 0)
lr_end_transaction(“withdraw”,LR_PASS);
else
lr_end_transaction(“withdraw”,LR_FAIL);
amount_overdrawn = get_amount_overdrawn();
}}
/ *客户无法提取透支
限制已达到。尝试撤回反正记录
服务器响应时间* /
id = lr_start_transaction_instance(“withdraw”,0);
status = bank_withdraw(500); / *这个调用会失败,但我们想计时* /
lr_end_transaction_instance(id,LR_PASS);
实施例2:
此示例演示父事务实例和子事务实例的嵌套。
#include“as_web.h”
Action()
{
long parent_trans_handle;
long child1_handle;
long child2_handle;
double trans_time;
int rc;
/ *启动主事务实例。
传递0作为父句柄指示
该事务没有父类。
函数返回值是在其他中使用的句柄
事务实例函数。 * /
parent_trans_handle =
lr_start_transaction_instance(“ParentTransaction”,0);
lr_output_message
(“父事务实例句柄是%ld。”,
parent_trans_handle);
/ *执行业务流程,这里用a表示
单个web_url调用。 * /
web_url(“web_url”,“URL = http://www.mercury.com”,LAST);
rc = lr_get_trans_instance_status(parent_trans_handle);
lr_output_message(“父事务状态为%d。”,rc);
if(rc == LR_FAIL){
/ * web_url失败了事务。
没有点继续,因为
未来的电话可能会失败* /
lr_end_transaction_instance(parent_trans_handle,LR_FAIL);
return;
}}
/ *启动子事务实例。
通过从另一个返回的句柄
lr_start_transaction_instance调用为
句柄参数使这个事务a
子实例。 * /
child1_handle =
lr_start_transaction_instance
(“ChildTransInstance”,parent_trans_handle);
lr_output_message
(“第一个子事务实例句柄是%ld。”,
child1_handle);
//执行业务流程
web_url(“web_url”,
“URL = http://www.mercury.com/services/index.html”,LAST);
/ *获取子事务实例的持续时间。
传递实例句柄。
持续时间(秒)是返回值。 * /
//总时长
trans_time =
lr_get_trans_instance_duration(child1_handle);
lr_output_message
(“第一个子实例时间是%lf秒。”,
trans_time);
//思考时间
trans_time =
lr_get_trans_instance_think_time(child1_handle);
lr_output_message
(“第一个子实例认为时间是%lf秒。”,
trans_time);
//浪费时间
trans_time =
lr_get_trans_instance_wasted_time(child1_handle);
lr_output_message
(“第一个子实例浪费时间是%lf秒。”,
trans_time);
/ *
启动同名的第二个子事务。
这是可能的,即使第一个仍然活动
因为我们使用的是句柄,而不是名称。
在真实的脚本中,你可以使用实例
同名的跟踪同一进程下
不同的条件。
此示例显示了事务实例
可以嵌套,是提醒你,这是技术上
可能,所以你小心避免做它。
具有嵌套事务的事务时间
的相同名称都不是你可以在任何分析的数据
有意义的方式。
* /
//启动同名的第二个实例
child2_handle = lr_start_transaction_instance
(“ChildTransInstance”,parent_trans_handle);
lr_output_message
(“第二个子实例句柄是%ld。”,
child2_handle);
//执行业务流程