Существует три типа транзакций Java: транзакция JDBC, транзакция JAVA (API транзакции Java) и транзакция контейнера. Общие транзакции контейнеров, такие как пружинные транзакции. Контейнерные транзакции в основном предоставляются серверами приложений J2EE. Большинство контейнерных транзакций завершены на основе JTA. Это довольно сложная реализация API на основе JNDI. Поэтому в этой статье не будет обсуждаться контейнерные транзакции в настоящее время. Эта статья в основном вводит две относительно основные транзакции в разработке J2EE: транзакция JDBC и транзакция JTA.
JDBC транзакции
Все поведения, включая транзакции, JDBC, основаны на соединении, а управление транзакциями выполняется через объект соединения в JDBC. В JDBC обычно используемые транзакционные методы: setautocommit, Commit, Oplback и т. Д.
Вот простой код транзакции JDBC:
public void jdbctransfer () {java.sql.connection conn = null; try {conn = conn = drivermanager.getConnection ("jdbc: oracle: thin: @host: 1521: sid", "username", "userpwd"); // Установить автоматический коммит в false, // Если установить на истину, база данных распознает каждое обновление данных в качестве транзакции и автоматически отправляет conn.setautocommit (false); stmt = conn.createStatement (); // уменьшить сумму в учетной записи A до 500 STMT.Execute ("/ Обновление T_ACCOUNT SET SUMT = SUMT - 500, где Account_ID = 'a'"); // Увеличение суммы в учетной записи b на 500 stmt.execute ("/ update t_account set out umm = sutr + 500, где account_id = 'b'"); // отправить транзакцию conn.commit (); // Комплект транзакции: двухэтапная операция переноса успешна одновременно} catch (sqlexception sqle) {try {// Исключение происходит, hollback () в этой транзакции conn.rollback (); // Отказ от транзакции: двухэтапная работа передачи полностью отозвать stmt.close (); conn.close (); } catch (исключение игнорировать) {} sqle.printstacktrace (); }}Приведенный выше код реализует простую передаточную функцию, которая управляет операцией передачи посредством транзакций, либо отправляя, либо откачусь.
Плюсы и минусы транзакций JDBC
JDBC предоставляет самую основную поддержку операций транзакций базы данных с использованием Java. Благодаря транзакциям JDBC мы можем поместить несколько операторов SQL в одну и ту же транзакцию, чтобы обеспечить их кислотные характеристики. Основное преимущество транзакций JDBC заключается в том, что API относительно прост, может реализовать самые основные операции транзакций, и производительность относительно хорошая.
Тем не менее, транзакции JDBC имеют одно ограничение: транзакция JDBC не может охватывать несколько баз данных! ! ! Следовательно, если участвуют несколько операций базы данных или распределенных сценариев, транзакции JDBC бессильны.
JTA транзакции
Зачем нужен JTA
Обычно транзакции JDBC могут решать такие проблемы, как согласованность данных. Учитывая, что его использование относительно простое, многие люди знают, что существуют транзакции JDBC о транзакциях в Java, или что некоторые люди знают о транзакциях в рамках (таких как Hibernate, Spring) и т. Д. Однако, поскольку JDBC не могут реализовать распределенные транзакции, и сегодня возникают больше и более распределенные сценарии, транзакции JTA.
Если вы не сталкиваетесь с сценариями, что транзакции JDBC не могут быть решены на работе, то вы можете только сказать, что проекты, которые вы делаете, все еще слишком малы. Возьмите веб-сайты электронной коммерции в качестве примера. Как правило, мы разделяем веб-сайт электронной коммерции горизонтально на модули продукта, модули заказа, модули корзины для покупок, модули сообщений, модули платежей и т. Д. Затем мы развертываем различные модули для разных машин, и каждый модуль общается через удаленные сервисные вызовы (RPC) и другие методы. Предоставлять услуги внешнему миру распределенной системой.
Процесс оплаты должен взаимодействовать с несколькими модулями, каждый модуль развернут на другой машине, а базы данных, работающие каждым модулем, являются противоречивыми. В настоящее время JDBC не может использоваться для управления транзакциями. Давайте посмотрим на кусок кода:
/ ** Обработка заказов на оплату **/ @Transactional (rowlbackfor = exception.class) public void felloworder () {orderdao.update (); // заказ службы локально обновления порядок статуса accountservice.update (); // Позвоните в службу учетной записи Фонда, чтобы добавить баллы в счет счета Фонда. Update (); // Позвоните в службу очков, чтобы добавить баллы в учетную запись учетной записи точек учетной записи AccountingService.insert (); // Позвоните в службу бухгалтерского учета, чтобы написать систему бухгалтерского учета. // Позвоните в службу уведомления об уведомлении торговца, чтобы отправить уведомление о результатах оплаты торговцу}Приведенный выше код представляет собой простую операцию процесса оплаты, в которой называются пять служб, все из которых вызываются через RPC. Как обеспечить согласованность транзакций с помощью JDBC? Я добавил @Transactional Annotation к методу, но из -за использования распределенной услуги транзакция не может достичь эффекта кислоты.
Транзакции JTA более мощные, чем транзакции JDBC. Транзакция JTA может иметь несколько участников, в то время как транзакция JDBC ограничена одним соединением базы данных. Компоненты любой из следующих платформ Java могут участвовать в транзакции JTA: JDBC Connection, JDO PersistenceManager, объект JMS, тема JMS, Enterprise Javabeans (EJB) и распределитель ресурсов, составленные со спецификацией архитектуры соединения J2EE.
Определение JTA
Java Transaction API (JTA) - это предприятие Java Enterprise Interface Interface. В среде Java он позволяет завершить распределенные транзакции по нескольким ресурсам XA.
JTA и его сооружение транзакций JAVA (JTS; Java TransactionService) предоставляют распределенные услуги транзакций для платформы J2EE. Тем не менее, JTA предоставляет только интерфейс и не предоставляет конкретную реализацию. Вместо этого он предоставляется поставщиком серверов J2EE в соответствии со спецификацией JTS. Есть несколько общих реализаций JTA:
1. Реализация JTA (JBOSS), предоставленная контейнером J2EE
2. Независимые реализации JTA: такие как JOTM, Atomikos. Эти реализации могут использоваться в средах, которые не используют серверы приложений J2EE для предоставления гарантий распределенной транзакции. Такие как Tomcat, пристани и обычные приложения Java.
JTA предоставляет java.transaction.usertransaction, который определяет следующие методы.
Здесь стоит отметить, что обычные операции JDBC могут быть непосредственно преобразованы в операции JTA без использования пользовательского транзакции. JTA имеет требования к источникам данных, подключению и ресурсам. Только классы, которые соответствуют спецификации XA и реализуют соответствующие интерфейсы спецификации XA, могут участвовать в транзакциях JTA. Что касается спецификации XA, пожалуйста, смотрите соответствующее введение в другой статье в моей статье. Здесь позвольте мне упомянуть, что текущие основные базы данных поддерживают спецификацию XA.
Чтобы использовать JTA Transactions, вам нужен драйвер JDBC, который реализует javax.sql.xadatasource, javax.sql.xaconnection и javax.sql.xaresource. Драйвер, который реализует эти интерфейсы, сможет участвовать в транзакциях JTA. Объект Xadatasource - это фабрика объекта Xaconnection. Xaconnection - это соединение JDBC, которое участвует в транзакциях JTA.
Чтобы использовать транзакции JTA, вы должны использовать Xadatasource для создания подключения к базе данных, а полученное соединение является соединением XA.
Разница между соединением XA (javax.sql.xaconnection) и соединением Nonxa (java.sql.connection) заключается в том, что XA может участвовать в транзакциях JTA и не поддерживает автоматические коммиты.
Пример кода:
public void jtatransfer () {javax.transaction.userTransaction tx = null; java.sql.connection conn = null; try {tx = (javax.transaction.usertransaction) context.lookup ("java: comp/usertransaction"); // Получить транзакции JTA, в этом случае контейнер JBoss управляется Javax.sql.Datasource ds = (javax.sql.datasource) context.lookup ("java:/xaoracleds"); // Получить пул соединений базы данных, должна быть база данных и драйвер, который поддерживает XA, который поддерживает tx.begin (); conn = ds.getConnection (); // Установить автоматический коммит в false, // Если установить на истину, база данных распознает каждое обновление данных в качестве транзакции и автоматически отправляет conn.setautocommit (false); stmt = conn.createStatement (); // уменьшить сумму в учетной записи A By 500 STMT.Execute ("/ Обновление T_ACCOUNT SET SUMT = SUMT - 500, где Account_ID = 'a'"); // Увеличение суммы в учетной записи b на 500 stmt.execute ("/ update t_account set out umm = sutr + 500, где account_id = 'b'"); // Увеличение суммы в учетной записи b на 500 stmt.execute ("/ update t_account set out umm = sutr + 500, где account_id = 'b'"); // Увеличение суммы в учетной записи b на 500 stmt.execute ("/ update t_account set out umm = sutr + 500, где account_id = 'b'"); // Комплект транзакции tx.commit (); // коммит транзакций: двухэтапная операция передачи является успешной одновременно} Catch (SQLEXCECTION SQLE) {try {// Исключение происходит, ROLLACK () в этой транзакции; // Отказ от транзакции: двухэтапная работа передачи полностью отменена stmt.close (); conn.close (); } catch (исключение игнорировать) {} sqle.printstacktrace (); }} Приведенный выше пример является операцией передачи с использованием транзакций JTA. Эта операция относительно зависит от контейнера J2EE и требует, чтобы пользовательский перевод и соединение было получено через JNDI.
Стандартные распределенные транзакции
Распределенная транзакция включает в себя менеджер транзакций и одного или нескольких менеджеров ресурсов. Диспетчер ресурсов - это постоянный хранение данных любого типа. Менеджер транзакций берет на себя ответственность за связь между всеми участниками транзакций.
Посмотрите на вышеупомянутое введение в распределенные транзакции, похоже ли это с управлением транзакциями в 2PC? Тем не менее, 2PC на самом деле является методом реализации для менеджера транзакций, который соответствует спецификации XA для координации нескольких менеджеров ресурсов. У меня было несколько статей 2 % и 3PC раньше. В этих статьях я представил, как менеджер транзакций в распределенных транзакциях координирует единый коммит или откат нескольких транзакций. Я также подробно расскажу о содержании, связанном с распределенными транзакциями, включая, помимо прочего, глобальные транзакции, модели DTP, гибкие транзакции и т. Д.
Плюсы и минусы JTA
Преимущество JTA заключается в том, что он обеспечивает распределенный транзакционный раствор и строгую кислоту. Однако стандартное управление транзакциями JTA обычно не используется в повседневном развитии, потому что у него много недостатков:
Комплекс реализации
Обычно JTA User Trantransaction должна быть получена из JNDI. Это означает, что если мы используем JTA, нам нужно использовать как JTA, так и JNDI.
Сам JTA - громоздкий API.
Обычно JTA может использоваться только в средах серверов приложений, поэтому использование JTA ограничивает возможность повторного использования кода.
Суммировать
Существует три типа транзакций Java: транзакция JDBC, транзакция JAVA (API транзакции Java) и транзакция контейнера. Среди них использование операций с транзакцией JDBC относительно просты и подходит для обработки операций того же источника данных. JTA транзакции являются относительно сложными и могут использоваться для обработки транзакций в нескольких базах данных. Они являются решением для распределенных транзакций.
Позвольте мне кратко поговорить об этом здесь. Хотя транзакции JTA - это набор API, предоставляемых Java для распределенных транзакций, различные платформы J2EE имеют разные реализации и не очень удобны в использовании. Следовательно, этот более ответственный API обычно не используется в проектах. Распределенные решения для транзакций, обычно используемые в отрасли, в настоящее время включают асинхронное обеспечение сообщений, TCC, уведомление о максимальных усилиях и т. Д.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.