DatabaseTransactionBegin

트랜잭션 실행 시작.

bool  DatabaseTransactionBegin(
   int  database      // DatabaseOpen에서 수신된 데이터베이스 핸들
   );

매개변수

database

[in] DatabaseOpen()로 수신된 데이터베이스 핸들.

성공하면 true를, 그렇지 않으면 false를 반환. 오류 코드를 가져오려면 GetLastError()를 사용해야 하며, 가능한 응답은 다음과 같습니다:

  • ERR_INTERNAL_ERROR (4001)                   –  심각한 런타임 오류;
  • ERR_INVALID_PARAMETER (4003)              –  sql 매개변수의 문자열이 비어있음;
  • ERR_NOT_ENOUGH_MEMORY (4004)          –  충분하지 않은 메모리;
  • ERR_WRONG_STRING_PARAMETER (5040)  – 요청을 UTF-8 문자열로 변환 중에 오류 발생;
  • ERR_DATABASE_INTERNAL (5120)              – 내부 데이터베이스 오류;
  • ERR_DATABASE_INVALID_HANDLE (5121)   – 유효하지 않은 데이터베이스 핸들;
  • ERR_DATABASE_EXECUTE (5124)               –  요청 실행 오류.

참고

트랜잭션을 실행하기 전에 DatabaseTransactionBegin() 기능을 호출해야 합니다. 모든 트랜잭션은 DatabaseTransactionBegin() 호출을 시작하고 DatabaseTransactionCommit() 호출로 끝나야 합니다.

예:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 파일 이름 생성
   string filename=AccountInfoString(ACCOUNT_SERVER) +"_"+IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN))+".sqlite";
//--- 공용 터미널 폴더에서 데이터베이스 열기/생성
   int db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: "filename" 코드와 함께 열기 실패 "GetLastError());
      return;
     }
//--- DEALS 표가 이미 있는 경우 삭제
   if(!DeleteTable(db"DEALS"))
     {
      DatabaseClose(db);
      return;
     }
//--- DEALS 표를 작성
   if(!CreateTableDeals(db))
     {
      DatabaseClose(db);
      return;
     }
//---  전체 트레이딩 내역을 요청
   datetime from_date=0;
   datetime to_date=TimeCurrent();
//--- 거래 내역을 지정 간격 내에 요청
   HistorySelect(from_dateto_date);
   int deals_total=HistoryDealsTotal();
   PrintFormat("트레이딩 내역 내 거래: %d "deals_total);
 
//--- DatabaseTransactionBegin/DatabaseTransactionCommit을 사용하여 트랜잭션 실행 속도를 측정
   ulong start=GetMicrosecondCount();
   bool fast_transactions=true;
   InsertDeals(dbfast_transactions);
   double fast_transactions_time=double(GetMicrosecondCount()-start)/1000;
   PrintFormat("Transations WITH    DatabaseTransactionBegin/DatabaseTransactionCommit: time=%.1f milliseconds"fast_transactions_time);
 
//--- DEALS 테이블을 삭제하고 다시 생성
   if(!DeleteTable(db"DEALS"))
     {
      DatabaseClose(db);
      return;
     }
//--- 새 DEALS 테이블 생성
   if(!CreateTableDeals(db))
     {
      DatabaseClose(db);
      return;
     }
 
//--- 이번에는 DatabaseTransactionBegin/DatabaseTransactionCommit를 사용하지 않고 다시 테스트
   fast_transactions=false;
   start=GetMicrosecondCount();
   InsertDeals(dbfast_transactions);
   double slow_transactions_time=double(GetMicrosecondCount()-start)/1000;
   PrintFormat("Transations WITHOUT DatabaseTransactionBegin/DatabaseTransactionCommit: time=%.1f milliseconds"slow_transactions_time);
//--- 시간의 증가를 보고
   PrintFormat("DatabaseTransactionBegin/DatabaseTransactionCommit 를 사용하여 %.1f 배 가속 제공"double(slow_transactions_time)/fast_transactions_time);
//--- 데이터베이스 닫기
   DatabaseClose(db);
  }
/*
Results:
   Deals in the trading history2737
   Transations WITH    DatabaseTransactionBegin/DatabaseTransactionCommittime=48.5 milliseconds
   Transations WITHOUT DatabaseTransactionBegin/DatabaseTransactionCommittime=25818.9 milliseconds
   Use of DatabaseTransactionBegin/DatabaseTransactionCommit provided acceleration by 532.8 times
*/
//+------------------------------------------------------------------+
//| 데이터베이스에서 지정된 이름의 표를 삭제        |
//+------------------------------------------------------------------+
bool DeleteTable(int databasestring table_name)
  {
   if(!DatabaseExecute(database"DROP TABLE IF EXISTS "+table_name))
     {
      Print("코드가 있는 테이블을 삭제 실패 "GetLastError());
      return(false);
     }
//--- 테이블이 성공적으로 삭제되었습니다
   return(true);
  }
//+------------------------------------------------------------------+
//| DEALS 표 생성                                          |
//+------------------------------------------------------------------+
bool CreateTableDeals(int database)
  {
//--- 표의 존재유무 확인
   if(!DatabaseTableExists(database"DEALS"))
      //--- 표 생성
      if(!DatabaseExecute(database"CREATE TABLE DEALS("
                          "ID          INT KEY NOT NULL,"
                          "ORDER_ID    INT     NOT NULL,"
                          "POSITION_ID INT     NOT NULL,"
                          "TIME        INT     NOT NULL,"
                          "TYPE        INT     NOT NULL,"
                          "ENTRY       INT     NOT NULL,"
                          "SYMBOL      CHAR(10),"
                          "VOLUME      REAL,"
                          "PRICE       REAL,"
                          "PROFIT      REAL,"
                          "SWAP        REAL,"
                          "COMMISSION  REAL,"
                          "MAGIC       INT,"
                          "REASON      INT );"))
        {
         Print("DB: 코드로 실패한 DEALS 테이블을 작성 "GetLastError());
         return(false);
        }
//--- 표가 성공적으로 생성되었습니다
   return(true);
  }
//+------------------------------------------------------------------+
//| 데이터베이스 표에 거래 추가                                 |
//+------------------------------------------------------------------+
bool InsertDeals(int databasebool begintransaction=true)
  {
//--- 보조 변수
   ulong    deal_ticket;         // 거래 티켓
   long     order_ticket;        // 거래가 실행된 주문 티켓
   long     position_ticket;     // 거래가 속한 포지션의 ID 
   datetime time;                // 거래 실행 시간
   long     type ;               // 거래 유형
   long     entry ;              // 거래 방향
   string   symbol;              // 거래가 실행된 심볼
   double   volume;              // 작업 볼륨
   double   price;               // 가격
   double   profit;              // 재정적 결과
   double   swap;                // 스왑
   double   commission;          // 수수료
   long     magic;               // 매직 넘버
   long     reason;              // 거래 실행 이유 또는 소스
//--- 모든 거래를 검토하고 데이터베이스에 추가
   bool failed=false;
   int deals=HistoryDealsTotal();
//--- 빠른 트랜잭션 성능 방법을 사용하는 경우
   if(begintransaction)
     {
      // --- 트랜잭션을 실행하기 전에 데이터베이스를 잠금
      DatabaseTransactionBegin(database);
     }
   for(int i=0i<dealsi++)
     {
      deal_ticket=    HistoryDealGetTicket(i);
      order_ticket=   HistoryDealGetInteger(deal_ticketDEAL_ORDER);
      position_ticket=HistoryDealGetInteger(deal_ticketDEAL_POSITION_ID);
      time= (datetime)HistoryDealGetInteger(deal_ticketDEAL_TIME);
      type=           HistoryDealGetInteger(deal_ticketDEAL_TYPE);
      entry=          HistoryDealGetInteger(deal_ticketDEAL_ENTRY);
      symbol=         HistoryDealGetString(deal_ticketDEAL_SYMBOL);
      volume=         HistoryDealGetDouble(deal_ticketDEAL_VOLUME);
      price=          HistoryDealGetDouble(deal_ticketDEAL_PRICE);
      profit=         HistoryDealGetDouble(deal_ticketDEAL_PROFIT);
      swap=           HistoryDealGetDouble(deal_ticketDEAL_SWAP);
      commission=     HistoryDealGetDouble(deal_ticketDEAL_COMMISSION);
      magic=          HistoryDealGetInteger(deal_ticketDEAL_MAGIC);
      reason=         HistoryDealGetInteger(deal_ticketDEAL_REASON);
      //--- 다음 요청에 따ㅏ 각 거래를 추가
      string request_text=StringFormat("INSERT INTO DEALS (ID,ORDER_ID,POSITION_ID,TIME,TYPE,ENTRY,SYMBOL,VOLUME,PRICE,PROFIT,SWAP,COMMISSION,MAGIC,REASON)"
                                       "VALUES (%d, %d, %d, %d, %d, %d, '%s', %G, %G, %G, %G, %G, %d, %d)",
                                       deal_ticket, order_ticket, position_tickettimetypeentrysymbolvolumepriceprofitswapcommissionmagicreason);
      if(!DatabaseExecute(databaserequest_text))
        {
         PrintFormat("%s: failed to insert deal #%dwith code %d"__FUNCTION__deal_ticketGetLastError());
         PrintFormat("i=%d: deal #%d  %s"ideal_ticket, symbol);
         failed=true;
         break;
        }
     }
//--- 트랜잭션 실행 오류를 확인
   if(failed)
     {
      //--- 빠른 트랜잭션 성능 방법을 사용하는 경우
      if(begintransaction)
        {
         //--- 모든 트랜잭션 롤백 및 데이터베이스 잠금 해제
         DatabaseTransactionRollback(database);
        }
      Print("%s: DatabaseExecute() failed with code "__FUNCTION__GetLastError());
      return(false);
     }
//--- 빠른 트랜잭션 성능 방법을 사용하는 경우
   if(begintransaction)
     {
      //--- 모든 트랜잭션이 성공적으로 수행됨 - 변경사항을 기록하고 데이터베이스 잠금을 해제
      DatabaseTransactionCommit(database);
     }
//--- 성공적으로 완료
   return(true);
  }
//+------------------------------------------------------------------+

추가 참조

DatabaseExecute, DatabasePrepare, DatabaseTransactionCommit, DatabaseTransactionRollback