(Инструкция на английском языке см. README-ENGLISH.md)
Лицензия: Apache 2.0
jTransactions — это отдельный Java-инструмент для управления транзакциями. В настоящее время в jTransactions реализованы две службы: TinyTX и SpringTx.
TinyTX — это микросервис декларативной транзакционной службы, состоящий всего из четырёх файлов.
SpringTx представляет собой обёртку над декларативной службой транзакций Spring (Spring-TX).
jTransactions является расширяемой платформой, которая в будущем будет дополняться новыми службами управления транзакциями. jTransactions работает с версией Java 6 и выше.
Скачайте jtransactions-1.0.0.jar
и поместите его в папку lib
проекта, либо добавьте следующие строки в файл pom.xml
:
<dependency>
<groupId>com.github.drinkjava2</groupId>
<artifactId>jtransactions</artifactId>
<version>1.x.x</version>
</dependency>
Примечание:
Если вы используете SpringTx, также потребуется добавить зависимость [Spring-tx]
(https://mvnrepository.com/artifact/org.springframework/spring-tx) в файл pom.xml
.
jTransactions предоставляет два интерфейса: ConnectionManager
и TxInterceptor
. Интерфейс ConnectionManager
имеет два метода: getConnection
и releaseConnection
. При использовании чистого JDBC эти два метода используются для получения и освобождения соединения. Реализации интерфейса TxInterceptor
предоставляются самой платформой; пользователи должны использовать их путём конфигурирования в инструментах IOC/AOP.#### Пример использования TinyTx
TinyTx — это небольшая декларативная служба, состоящая всего из четырёх файлов, обычно используется для малых проектов. Ниже приведён пример использования TinyTx (включённый в jTransactions) вместе с jBeanBox и DbUtils-pro:
public class TinyTxBox extends BeanBox { // конфигурация транзакционной службы
this.setConstructor(TinyTx.class, BeanBox.getBean(DataSourceBox.class), Connection.TRANSACTION_READ_COMMITTED);
}
public class TinyTxManagerTest {
DbPro dbPro = new DbPro((DataSource) BeanBox.getBean(DataSourceBox.class));
@Before
public void createDB() {
DbPro db = new DbPro((DataSource) BeanBox.getBean(DataSourceBox.class));
try {
db.iExecute("drop table users");
} catch (Exception e) {
}
db.iExecute("create table users(id varchar(36), name varchar(40)) engine=InnoDB");
}
@After
public void cleanup() {
BeanBox.defaultContext.close(); // закрыть datasource pool
}
public void insert1() {
dbPro.iExecute("insert into users (id) values(?)", param0(UUID.randomUUID().toString()));
Assert.assertEquals(1L, dbPro.iQueryForObject("select count(*) from users"));
System.out.println("Теперь есть 1 запись в таблице users");
}
public void insert2() {
dbPro.iExecute("insert into users (id) values(?)", param0(UUID.randomUUID().toString()));
Assert.assertEquals(2L, dbPro.iQueryForObject("select count(*) from users"));
System.out.println("Теперь есть 2 записи в таблице users, но будет откат до 0");
System.out.println(1 / 0); // Бросить исключение, должно произойти откат транзакции
}
}
Пример использования транзакций в Spring TX
jTransactions просто создаёт простое обёртывание для Spring-TX, пример см. в папке test\...\SpringTx
.
Настройка и переключение службы транзакций во время выполнения Ниже приведён пример настройки и переключения службы транзакций (между TinyTx и SpringTx) во время выполнения:```java public class CommonTxTester {
public static class TxBox extends BeanBox { { this.setConstructor(TinyTx.class, BeanBox.getBean(DataSourceBox.class), Connection.TRANSACTION_READ_COMMITTED); } }
public static class TxTester { private TinyJdbc tiny;
public TxTester(DataSource ds, ConnectionManager cm, CommonTx tx) {
tiny = new TinyJdbc(ds, cm);
}
@AopAround(TxBox.class)
public void tx_Insert1() {
tiny.executeSql("insert into users (id) values('123')");
}
@AopAround(TxBox.class)
public void tx_Insert2() {
tiny.executeSql("insert into users (id) values('456')");
Assert.assertEquals(2L, tiny.queryForObject("select count(*) from users"));
System.out.println("Сейчас есть 2 записи в таблице users, но будет откат до 1");
System.out.println(1 / 0);
}
public void doTest() {
try {
tiny.executeSql("drop table users");
} catch (Exception e) {
}
tiny.executeSql("create table users (id varchar(40)) engine=InnoDB");
Assert.assertEquals(0L, tiny.queryForObject("select count(*) from users"));
try {
tx_Insert1(); // эта запись вставляет одну запись
tx_Insert2(); // эта запись не вставляет, происходит откат
} catch (Exception e) {
e.printStackTrace();
System.out.println("Обнаружена ошибка div/0, tx_Insert2 должна произвести откат");
}
Assert.assertEquals(1L, tiny.queryForObject("select count(*) from users"));
}
} }
```markdown
@Test
public void userTinyTx() {
BeanBox testerBox = new BeanBox(); // jBeanBox — это инструмент IOC/AOP
testerBox.setConstructor(TxTester.class, BeanBox.getBean(DataSourceBox.class),
TinyTxConnectionManager.instance(), BeanBox.getBean(TxBox.class));
testerBox.setConstructorTypes(DataSource.class, ConnectionManager.class, CommonTx.class);
}
``````markdown
Выше приведены все документы jTransactions. В случае возникновения вопросов обратитесь к демонстрационным тестам или исходному коду.
```java
TxTester tester = testerBox.getBean();
System.out.println(tester);
tester.doTest();
BeanBox.defaultContext.close(); // Освобождает бассейн источников данных
@Test
public void userSpringTx() {
DataSource ds = BeanBox.getBean(DataSourceBox.class);
DataSourceTransactionManager pm = new DataSourceTransactionManager();
pm.setDataSource(ds);
Properties props = new Properties();
props.put("tx_*", "PROPAGATION_REQUIRED");
BeanBox springBox = new BeanBox();
springBox.setConstructor(SpringTx.class, pm, props);
SpringTx springTx = springBox.getBean();
BeanBox testerBox = new BeanBox();
testerBox.setConstructorTypes(DataSource.class, ConnectionManager.class, CommonTx.class);
testerBox.setConstructor(TxTester.class, ds, SpringConnectionManager.instance(), springTx);
// ниже заменяет синглтон на SpringTX
BeanBox.defaultContext.getSingletonCache().put(TxBox.class.getName(), springTx);
TxTester tester = testerBox.getBean();
System.out.println(tester);
tester.doTest();
BeanBox.defaultContext.close(); // Освобождает бассейн источников данных
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )