Menu

SQL обработчик raiserror

Help
2016-07-06
2016-08-03
  • Artur Nigmatullin

    Добрый день!
    1. При срабатывании raiserror в обработчике SQL, после изменения переменных на форме элемента Действие, процесс, как и положено, не двигается дальше, но при этом переменные введённые(изменённые) на форме сохраняются в процессе. Так и задумывалось или это ошибка?
    2. Если на элемент Действие наложить таймер с задержкой и альтернативным путём выполнения, а по основному пути в обработчике SQL срабатывает raiserror, форма меняется на
    "Данное задание уже выполнено другим пользователем или просрочено", и задание исчезает из Списка заданий пользователя, хотя процесс по основному пути дальше обработчика SQL не пошёл.

    Версия сервера 4.3.0 с последними изменениями из trunk на 06.07.2016

     

    Last edit: Artur Nigmatullin 2016-07-06
  • Artur Nigmatullin

    Попробовал на тестовом процессе, где убрал всё лишнее, оставив только суть проблемы, там всё ок, переменные не перезаписываются при получении raiserror. Буду разбираться. Извините за беспокойство.

    А вот с таймером ошибка воспроизводится

    На самом деле, так и не сумел понять закономерность почему в одном процессе задание исчезает после срабатывания raiserror с сообщением "Данное задание уже выполнено другим пользователем или просрочено", а в другом всё работает. И похоже что данная ошибка никак не связана с таймером

     

    Last edit: Artur Nigmatullin 2016-07-07
  • Dofs

    Dofs - 2016-07-10

    Добрый день.
    Изменение переменных БП и движение точки управления выполняется в одной транзакции.
    Немного описано в http://www.runawfe.org/rus/doc/ProcessTransactions.
    Если вы сможете воспроизвести обратное - рапортуйте баг со всем необходимым (БП, процедура и т.п.) - разберёмся.

     
  • Dofs

    Dofs - 2016-07-24

    Добрый день.
    Я попытался воспроизвести проблему на SQL Server 11.0.2100.60, не получилось.
    1. Использовал один и тот же источник данных что и для runawfe
    2. Настроил другой источник данных
    3. Настроил другой источник данных в режиме
    <system-properties>
    <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
    </system-properties>
    Пишет замечание, но логической ошибки всё равно не наблюдаю.
    06:28:44,799 WARN [com.arjuna.ats.arjuna] (timerFactory) ARJUNA012142: You have chosen to enable multiple last resources in the transaction manager. This is transactionally unsafe and should not be relied upon.
    Данные при откате транзакции не меняются, управление не уходит из задачи.

    В связи с этим вопросы:
    - сколько используется источников данных в jboss?
    - как у вас они настроены
    - какая версия SQL Server

     

    Last edit: Dofs 2016-07-24
  • Artur Nigmatullin

    Добрый день!
    Попробовал на всякий случай создать в mssql чистую базу, ошибка повторилась.
    Попробовал тот же процесс но Руну запустил на стандартном h2, при этом raiserror все равно выполняется в базе данных mssql,ошибка не воспроизводится.

    • в standalone прописаны в блоках datasource 5 источников данных в том числе стандартный h2. Источники данных в mssql описываются так:

    <datasource jta="false" jndi-name="java:/mssqlds" pool-name="java:/mssqlds_Pool">
    <connection-url>jdbc:jtds:sqlserver://localhost;DatabaseName=wfe</connection-url>
    <driver>mssql</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <pool>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>30</max-pool-size>
    </pool>
    <security>
    <user-name>sa</user-name>
    <password>sa</password>
    </security>
    </datasource>

    и драйвер:

    <driver name="mssql" module="net.sourceforge.jtds">
    <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
    <xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
    </driver>

    • Для использования mssql в качестве сервера Руны в файле wfe.custom.database.properties прописаны свойства:
      hibernate.dialect=org.hibernate.dialect.SQLServerDialect
      hibernate.connection.datasource=java:/mssqlds

    • версия mssql на котором крутится руна, а также расположены 2 других источника данных, в том числе тот на котором выполняется функция raiserror:
      Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
      Feb 10 2012 19:39:15
      Copyright (c) Microsoft Corporation
      Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

      • версия mssql с ещё одним источником данных:
        Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
        Apr 2 2010 15:48:46
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
     
  • Dofs

    Dofs - 2016-07-26

    Думаю что проблема кроется в использовании jta="false": http://www.mastertheboss.com/jboss-server/jboss-datasource/demystifying-datasource-jta-and-xa-settings-on-jboss-wildfly.
    По-хорошему нужно использовать XA источники данных (распределённые транзакции).
    Использование "com.arjuna.ats.arjuna.allowMultipleLastResources" видимо получше в данном сценарии, но тоже может приводить к проблемам при некоторых условиях (SQL в обработчике закоммитится, а выполнение БП откатится назад).

     
  • Artur Nigmatullin

    Большое спасибо!
    Удаление свойства jta="false" в datasource источника данных для сервера самой Руны на mssql помогло.
    Datasource mssql выглядит теперь так:
    `
    <datasource jndi-name="java:/mssqlds" pool-name="java:/mssqlds_Pool">
    <connection-url>jdbc:jtds:sqlserver://localhost;DatabaseName=runa_server</connection-url>
    <driver>mssql</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>

    <pool>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>30</max-pool-size>
    </pool>
    <security>
    <user-name>sa</user-name>
    <password>sa</password>
    </security>
    </datasource>
    `
    В остальных источниках данных mssql не стал пока удалять jta="false" потому, что на самом деле не понимаю, что даёт это свойство, но почему то раньше я его ставил.

     

    Last edit: Artur Nigmatullin 2016-07-27
    • Dofs

      Dofs - 2016-07-28

      Оно делает источники данных локальными источниками, не вовлекая их в общую транзакцию сервера приложений. Кроме спец. случаев это нежелательный режим, по-моему.

      Ставили вы его возможно потому что без него не работает работа с несколькими источниками данных :)

       

      Last edit: Dofs 2016-07-28
  • Artur Nigmatullin

    Настроил источники данных MSSQL в таком виде:
    <xa-datasource jndi-name="java:/mssqlds" pool-name="mssqlds" enabled="true" use-ccm="false">
    <xa-datasource-property name="ServerName">
    localhost
    </xa-datasource-property>
    <xa-datasource-property name="DatabaseName">
    runa_server
    </xa-datasource-property>
    <driver>mssql</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <xa-pool>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>30</max-pool-size>
    <is-same-rm-override>false</is-same-rm-override>
    <interleaving>false</interleaving>
    <pad-xid>false</pad-xid>
    <wrap-xa-resource>false</wrap-xa-resource>
    </xa-pool>
    <security>
    <user-name>sa</user-name>
    <password>sa</password>
    </security>
    <validation>
    <validate-on-match>false</validate-on-match>
    <background-validation>false</background-validation>
    </validation>
    <statement>
    <share-prepared-statements>false</share-prepared-statements>
    </statement>
    </xa-datasource>

     

    Last edit: Artur Nigmatullin 2016-08-03

Log in to post a comment.