2017-02-14 18 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 2, поскольку идентификатор второй записи содержит один и тот же идентификатор, и когда я запускаю следующее приложение mule. MySQLIntegrityConstraintViolationException возникает ошибка, но первые 2 записи были вставлены в DB, ​​поскольку ошибка приходит в записи без 3. Но здесь я хочу, чтобы предотвратить вставку записей или откат изменений, если все записи не вставлены в БД (означает, что любая ошибка возникает между ними).

Ниже мой мул XML файл конфигурации для вставки данных JSON в БД:

<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