Перейти к основному содержимому

Создание GraphQL-транзакций

Формулировка задачи

Добавить в базу данных группу связанных данных, объединив запросы в транзакцию. Например, нужно добавить несколько заказчиков, в то время как добавление каждого из них по отдельности не имеет смысла.

Пользовательский сценарий работы с транзакциями в разработанном проекте должен быть следующий:

  1. На экранной форме перед вводом группы заказчиков пользователь нажимает кнопку Begin Transaction.

  2. Пользователь вводит имя заказчика и нажимает Add Customer.

    Пользователь повторяет это действие несколько раз согласно количеству заказчиков в группе.

  3. По завершении ввода всех заказчиков группы пользователь нажимает Commit Transaction.

    В результате введенная группа заказчиков отображается в таблице и записывается в базу данных.

    Если вместо Commit Transaction пользователь нажимает RollBack Transaction, введенная группа заказчиков не отображается в таблице и не записывается в базу данных.

Предварительные требования

Создан проект. Настроена модель безопасности.

В разрабатываемом проекте создан класс Customer с атрибутом Name типа string.

На основе класса модели данных сгенерирована экранная форма CustomerPage. Для экранной формы CustomerPage с таблицей, отображающей заказчиков, настроены параметры маршрутизации /TransactionDemo, TransactionDemo.

В результате генерации для экранной формы CustomerPage сгенерированы следующий действия:

  • GetCustomer: для получения данных класса Customer;
  • CreateCustomer: для создания экземпляра класса Customer.

Рекомендуемое решение задачи

Рекомендуемый подход к решению описанной задачи включает следующие шаги:

  1. Добавление компонентов на экранную форму CustomerPage.

    На экранную форму CustomerPage добавьте компонент Input для ввода имен заказчиков и четыре компонента Button для управления вводом и транзакциями со следующими значениями свойства Text:

    • Begin Transaction;
    • Add Customer;
    • Commit Transaction;
    • RollBack Transaction.
  2. Создание действий типа GraphQL для экранной формы CustomerPage.

    В то время, когда файл описания экранной формы открыт, создайте следующие действия типа GraphQL:

    • BeginTransaction для начала транзакции;
    • CommitTransaction для завершения транзакции;
    • RollBackTransaction для отмены транзакции.

    Текст GraphQL-запроса для описания действия BeginTransaction представлен в следующем блоке кода:

    mutation BeginTransaction {
    beginTransaction(timeoutms: 600000, level: READ_COMMITTED) {
    transactionId
    }
    },

    Текст GraphQL-запроса для описания действия CommitTransaction представлен в следующем блоке кода:

    mutation CommitTransaction($transactionId: UUID!) {
    commitTransaction(transactionId: $transactionId)
    }

    Текст GraphQL-запроса для описания действия RollbackTransaction представлен в следующем блоке кода:

    mutation RollbackTransaction($transactionId: UUID!) {
    rollbackTransaction(transactionId: $transactionId)
    }
  3. Описание обработчиков событий в виде функций для кнопок на экранной форме CustomerPage.

    Для обработчика события OnClick() кнопки Begin Transaction введите следующий блок кода:

    {async () => {
    const result = await executeAction("BeginTransaction");
    setState({transactionId: result.beginTransaction.transactionId});
    }} // в переменную состояния transactionId экранной формы записывается значение идентификатора транзакции
    });
    }

    Для обработчика события OnClick() кнопки Add Customer введите следующий блок кода:

    {async () => {
    await executeAction("CreateCustomer", {Name: getValue('TextInput')}, {transactionId: getValue('transactionId')});
    await getDataSource('getCustomer').load();
    }}

    Для обработчика события OnClick() кнопки Commit Transaction и введите следующий блок кода:

    {async () => {
    await executeAction("CommitTransaction", {transactionId: getValue('transactionId')});
    await getDataSource('getCustomer').load();
    }}

    Для обработчика события OnClick() кнопки RollBack Transaction введите следующий блок кода:

    {async () => {
    await executeAction("RollbackTransaction", {transactionId: getValue('transactionId')});
    await getDataSource('getCustomer').load();
    }}