2017-02-14 4 views
0

는 내가 모든 레코드 또는 그들 중 누구도 하나를 삽입 할 여기에 다음과 같은 JSON 파일Mule에 대량의 레코드를 삽입하는 중에 오류가 발생하면 데이터베이스 변경 사항을 롤백하는 방법은 무엇입니까?

[ 
    { 
     "id": 1, 
     "name": "Ramesh", 
     "designation": "SE", 
     "salary": 25000.00 
    }, 
    { 
     "id": 2, 
     "name": "Anjali", 
     "designation": "SE", 
     "salary": 20000.00 
    }, 
    { 
     "id": 2, 
     "name": "Harrish", 
     "designation": "PM", 
     "salary": 120000.00 
    }, 
    { 
     "id": 4, 
     "name": "Rahul", 
     "designation": "TA", 
     "salary": 150000.00 
    } 
] 

있습니다. 모든 네 개의 레코드가 직원 데이터베이스에 삽입되거나 위의 어느 것도 삽입되지 않는다는 것을 의미합니다. 하지만 여기에서는 세 번째 레코드가 두 번째 레코드의 ID가 동일한 ID를 유지하고 다음 노새 응용 프로그램을 실행할 때 ID 2가 중복 된 것을 볼 수 있습니다. MySQLIntegrityConstraintViolationException 오류가 발생하지만 첫 번째 레코드가 DB에 삽입되었습니다. 여기 내가 원하는 것은 모든 레코드가 DB에 삽입되지 않은 경우 레코드 삽입 또는 롤백 변경을 방지하는 것입니다. 즉, 모든 오류가 중간에 오는 것을 의미합니다. 다음은

DB로 JSON 데이터를 삽입하는 내 노새 XML 설정 파일은 다음과 같습니다

<sub-flow name="insert-fulltime-employee-details-subflow"> 
     <dw:transform-message metadata:id="35bfe913-8de7-4b3c-9ba9-98f375a2873e" doc:name="Transform Message"> 
      <dw:input-payload mimeType="application/json"/> 
      <dw:set-payload><![CDATA[%dw 1.0 
%output application/java 
--- 
payload map ((payload01 , indexOfPayload01) -> { 
    id: payload01.id, 
    name: payload01.name, 
    designation: payload01.designation, 
    salary: payload01.salary 
})]]></dw:set-payload> 
     </dw:transform-message> 
     <foreach doc:name="For Each"> 
      <db:insert config-ref="MySQL_Configuration" doc:name="Database-Insert"> 
       <db:parameterized-query><![CDATA[insert into fulltime_employee values (#[payload.id], #[payload.name], #[payload.designation], #[payload.salary])]]></db:parameterized-query> 
      </db:insert> 
     </foreach> 
     <set-payload value="{&quot;message&quot;: &quot;All data successfully inserted into database&quot;}" mimeType="application/json" doc:name="Set Payload"/> 
</sub-flow> 

내가 어떻게 이것을 달성 할 수 있습니까?

답변

1

롤백해야하는 블록을 "트랜잭션 범위"로 줄 바꿈하십시오. 아래처럼

<transactional action="ALWAYS_BEGIN" doc:name="Transactional"> 
<db:insert config-ref="MySQL_Configuration" doc:name="Database-Insert"> 
       <db:parameterized-query><![CDATA[insert into fulltime_employee values (#[payload.id], #[payload.name], #[payload.designation], #[payload.salary])]]></db:parameterized-query> 
      </db:insert> 
</transactional> 
+0

트랜잭션 범위가 작동하지 않습니다. 오류 (여기에서 기본 키 위반)가 발생하면 레코드 삽입을 방지 할 수 없습니다. – Aditya