Commit fdda3cd9 by guanghui.cui

sql执行异常,数据进行回滚

parent fc7bfe9f
......@@ -2,7 +2,7 @@
* ServicePool.cpp
*
*/
#include <exception>
#include "../3rdParty/easylogging/easylogging++.h"
#include "MySQLService.h"
......@@ -139,11 +139,19 @@ int MySQLService::query()
}
LOG(INFO) << "SQL : " << sqlStr;
///执行sql查询
try
{
if (0 != mysql_query(&_connect, sqlStr)) {
LOG(ERROR) << sqlStr;
LOG(ERROR) << "query sql exception: " << mysql_error(&_connect);
return -1;
}
}
catch (exception& e)
{
LOG(ERROR) << "catch sql exception:" << e.what();
return -1;
}
///保存查询结果
if (NULL == (_result = mysql_store_result(&_connect))) {
......
......@@ -197,6 +197,7 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
nErrCode = mysql->insert();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
......@@ -207,6 +208,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
values('%s',%d,%d,'%s')", \
orderIdStr,order.vecProducts[i].consume_num,order.vecProducts[i].original_price,order.vecProducts[i].pid.data());
nErrCode = mysql->insert();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
}
//获取系统时间,添加记录时使用
......@@ -242,6 +249,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
VALUES('%s',%d,'%s',%d,1,'1',4,'%s',3,99,99,4,'%s',4,99,4,1,'%s',%.2f,%.2f,%.2f,%.2f,'1',0.1,1,'%s')", \
strDate.data(),orderId,orderIdStr,iOutlet,chTime,chTime,chTime,merchantTot,order.shop_fee/100.00,discount,merchantTot,chTime);
nErrCode = mysql->insert();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
//获取商品详细信息,如果是套餐,把套餐菜品加入vector
std::vector<DishInfo> vecDish;
......@@ -256,6 +269,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
int childCount=0;
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"SELECT IsSetMenu FROM tbl_Menu WHERE Item='%s';",product.pid.data());
nErrCode = mysql->query();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
if (NULL != (mysql->_row = mysql_fetch_row(mysql->_result))){
suit=atoi(mysql->_row[0]);
mysql_free_result(mysql->_result);
......@@ -263,6 +282,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
int pIndex=vecDish.size()+1;
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"SELECT ChildItem,UnitQty FROM tbl_SetMenu WHERE ParentItem='%s';",product.pid.data());
nErrCode = mysql->query();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
while ((mysql->_row = mysql_fetch_row(mysql->_result)) != NULL){
DishInfo childInfo={0,0,"",0,0,2,"0"};
childInfo.pid=mysql->_row[0];
......@@ -293,6 +318,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
//查询商品详细信息
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"SELECT Name3,PrintQ1,PrintQ2,PrintQ3,PrintQ4,PrintQ5,Category,Dept FROM tbl_Menu WHERE Item='%s';",dish.pid.data());
nErrCode = mysql->query();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
if (NULL != (mysql->_row = mysql_fetch_row(mysql->_result))){
dish_name=mysql->_row[0];
print1=atoi(mysql->_row[1]);
......@@ -313,6 +344,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
print5,dish.isPrintCheck.data(),price_product,price_product,discount_product,\
dish.consume_num,tot_product,discount_product,tot_product,dept,cat,chTime,dish.index,dish.childCount);
nErrCode = mysql->insert();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
}
// //订单商品写入“订单详情表”
......@@ -354,6 +391,12 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
VALUES('%s',%d,%d,1,%d,'%s',4,'%s',99,%.2f,1,'',1,'%s')", \
strDate.data(),orderId,iOutlet,atoi(posTakeway.merchantTypeId.data()),posTakeway.strName.data(),chTime,merchantTot,chTime);
nErrCode = mysql->insert();
if(nErrCode != EC_OK)
{
rollbackData(orderIdStr);
pthread_mutex_unlock(&mutex); //解锁
return EC_EX_SQL_FAILED;
}
pthread_mutex_unlock(&mutex); //解锁
return 0;
}
......@@ -647,6 +690,25 @@ void COrderInfo::CleanOldData()
LOG(INFO)<<"Clean up more than six months of data";
}
void COrderInfo::rollbackData(std::string orderid)
{
int iOrderId=atoi(orderid.data());
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"DELETE FROM fmTakeaway WHERE orderid='%s';",orderid.data());
mysql->remove();
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"DELETE FROM fmTakeaway_products WHERE orderid='%s';",orderid.data());
mysql->remove();
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"DELETE FROM tbl_Check WHERE `Check`=%d;",iOrderId);
mysql->remove();
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"DELETE FROM tbl_Item WHERE `Check`=%d;",iOrderId);
mysql->remove();
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"DELETE FROM tbl_Payment WHERE `Check`=%d;",iOrderId);
mysql->remove();
}
//需要导出的函数,即用户在外部可以调用的接口
bool GetOperationObject(void** _RtObject)
{
......
......@@ -94,6 +94,7 @@ private:
//向数据库总添加:fmTemp表 | 触发器 | fmTakeaway表 | fmTakeaway_products表
int AddFMTable();
void rollbackData(std::string orderid);
pthread_mutex_t mutex; //互斥锁
MySQLService *mysql;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment