9.Benchmark SQL 数据库测试工具代码——事务New-Order
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50357678
New-Order事务是一个中等的量级的读写事务。
是整个负载的主心骨。
1. 输入input data
仓库ID,区域ID,用户ID,物品数量,是否本地供货,物品ID,供货仓库ID,订单数量。
其中区域ID随机从1~10中区,保证D_W_ID=W_ID。
用户ID,通过随机获取,保证C_D_ID=D_ID,C_W_ID=W_ID。
物品数量5~15之间,平均是10。
默认都是本地
物品ID是数组,取决于物品数量,数据就多大
供货仓库ID也是数组,取决于物品数量,数据就多大
订单数量也是数组,取决于物品数量,数据就多大。
根据物品数量,进行循环:
设置物品ID(1~10 0000)
获取供货仓库ID,1%的概率是异地供货。
物品数量时随机1~10之间。
然后1%的需要回滚,将最后一种物品的ID(一个订单平均有10种物品)设置为-12345
参数设置完毕。
2. 步骤一SELECT FROMCUSTOMER&WAREHOUSE
先从customer表,warehouse表中,获取 c_discount,c_last,c_credit,w_tax属性。
使用条件是w_id, w_id=c_w_id,c_d_id,c_id.
"SELECT c_discount, c_last,c_credit, w_tax" +
" FROM benchmarksql.customer,benchmarksql.warehouse" +
" WHERE w_id = ? AND w_id = c_w_id"+
" AND c_d_id = ? AND c_id = ?"
3. 步骤二select from district
从表district 中选择 d_next_o_id,d_tax 用于更新。使用for update锁住要更新的行。
"SELECT d_next_o_id, d_taxFROM benchmarksql.district" +
" WHERE d_id = ? AND d_w_id = ? FOR UPDATE"
4. 步骤三insert into new_order
将o_id,d_id,w_id的值 插入到表中NEW_ORDER。
"INSERT INTObenchmarksql.NEW_ORDER (no_o_id, no_d_id, no_w_id) " +
"VALUES ( ?, ?, ?)"
5. 步骤四update district
更新district表中的d_next_o_id值。
UPDATE benchmarksql.district SETd_next_o_id = d_next_o_id + 1 " +
" WHERE d_id = ? AND d_w_id = ?
6. 步骤五insert into oorder
插入到表oorder中,包括o_id,d_id,w_id,c_id,o_ol_cnt,o_all_local
"INSERT INTObenchmarksql.OORDER " +
" (o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_ol_cnt,o_all_local)" +
" VALUES (?, ?, ?, ?, ?, ?, ?)"
7. 步骤六select from item & update stock
根据订单中物品种类(平均10个)
循环:
每个物品的供应仓库,每个物品的数量。
如果如果物品的ID为-12345则抛出异常,后续回滚。
从ITEM表中选择物品的价格、名字、数据
"SELECT i_price, i_name , i_data FROMbenchmarksql.item WHERE i_id = ?"
然后从stock表(库存中)选择需要更新的行如下:
"SELECT s_quantity, s_data,s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, " +
" s_dist_06, s_dist_07,s_dist_08, s_dist_09, s_dist_10" +
" FROM benchmarksql.stock WHERE s_i_id = ? AND s_w_id = ? FORUPDATE"
其中使用了select …for update.
获得stock表中的相关信息,
然后处理stock中的s_quantity数量。以及s_remote_cnt_increment.进行更新,如下:
"UPDATE benchmarksql.stockSET s_quantity = ? , s_ytd = s_ytd + ?, s_remote_cnt = s_remote_cnt + ? " +
" WHERE s_i_id =? AND s_w_id = ?"
8. 步骤七insert into order_line
获取该物品的价格(单价乘以数量)
然后根据该物品中i_data和s_data中是否包含ORIGINAL字符串,来判断物品品牌是BAD还是GOOD。
接着根据d_id(区域ID)来设置 ol_dist_info
最后插入到order_line表中,如下:
"INSERT INTObenchmarksql.order_line (ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id,ol_supply_w_id," +
" ol_quantity, ol_amount,ol_dist_info) VALUES (?,?,?,?,?,?,?,?,?)"
循环结束。
9. 步骤八print message
输出该订单相关的信息,
用户所在的仓库ID
仓库税
区域ID
区域税
订单ID
订单物品种类数量
用户ID
用户名字
用户信用折扣
每种物品的仓库ID,物品ID,物品名字,该物品数量,仓库数量,物品品牌,单品价格,该物品合计
最后输出该订单的总价格。
然后该交易结束。