Как откатить изменения базы данных после возникновения ошибки при вставке большого количества записей в Mule?

У меня есть следующий файл json

[
    {
         "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
    }
]

Здесь я хочу вставить либо все записи, либо ни одну из них. Означает, что все четыре записи будут вставлены в базу данных сотрудников или ни одна из них выше. Но здесь вы можете видеть, что третья запись имеет повторяющийся идентификатор 2, так как идентификатор второй записи содержит тот же идентификатор, и когда я запускаю следующее приложение-мул, возникает ошибка MySQLIntegrityConstraintViolationException, но первые 2 записи были вставлены в БД, поскольку ошибка возникает в записях № 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>

Как я могу этого добиться?


person Aditya    schedule 14.02.2017    source источник


Ответы (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>
person Senthil c    schedule 14.02.2017
comment
Транзакционная область не работает для меня. Он не может предотвратить вставку записей, если возникает ошибка (здесь нарушение первичного ключа). - person Aditya; 15.02.2017