1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/drinkjava2-jTransactions

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-ENGLISH.md 8.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 07.03.2025 04:24 ebc4689

(Инструкция на английском языке см. README-ENGLISH.md)

jTransactions

Лицензия: Apache 2.0

jTransactions — это отдельный Java-инструмент для управления транзакциями. В настоящее время в jTransactions реализованы две службы: TinyTX и SpringTx.

TinyTX — это микросервис декларативной транзакционной службы, состоящий всего из четырёх файлов.

SpringTx представляет собой обёртку над декларативной службой транзакций Spring (Spring-TX).

jTransactions является расширяемой платформой, которая в будущем будет дополняться новыми службами управления транзакциями. jTransactions работает с версией Java 6 и выше.

Как импортировать jTransactions?

Скачайте 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); // Бросить исключение, должно произойти откат транзакции
    }
}
  1. Пример использования транзакций в Spring TX jTransactions просто создаёт простое обёртывание для Spring-TX, пример см. в папке test\...\SpringTx.

  2. Настройка и переключение службы транзакций во время выполнения Ниже приведён пример настройки и переключения службы транзакций (между 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/drinkjava2-jTransactions.git
git@api.gitlife.ru:oschina-mirror/drinkjava2-jTransactions.git
oschina-mirror
drinkjava2-jTransactions
drinkjava2-jTransactions
master