@Transaction(readOnly = true) default void readTxn(Runnable r) { r.run(); } }
@Transaction(readOnly = false) default void writeTxn(Runnable r) { r.run(); }
@Transaction default Something fail(int id, String name) throws IOException { insert(id, name); throw new IOException("woof"); } }
@Transaction default void insert(CountDownLatch inserted, int id, String name) { reallyInsert(id, name); inserted.countDown(); }
@Transaction(TransactionIsolationLevel.REPEATABLE_READ) default void outerMethodWithOneLevelCallsInnerMethodWithAnotherLevel() throws TransactionException { // error! inner method specifies a different isolation level. innerMethodWithADifferentLevel(); }
@Transaction default Something failed(int id, String name) throws IOException { insert(id, name); throw new IOException("woof"); } }
@Transaction(TransactionIsolationLevel.READ_UNCOMMITTED) default void outerMethodCallsInnerWithSameLevel() { // this works: isolation levels agree innerMethodSameLevel(); }
@Transaction(TransactionIsolationLevel.READ_COMMITTED) default void outerMethodWithLevelCallsInnerMethodWithNoLevel() { // this also works: inner method doesn't specify a level, so the outer method controls. innerMethodWithNoLevel(); }
@Transaction(READ_COMMITTED) default void nestedTransactionWithDifferentIsolation() { transactionWithIsolation(); } }
@SqlUpdate("INSERT INTO USERS (name) VALUES (:name)") @Transaction(TransactionIsolationLevel.READ_COMMITTED) void insertUser(String name); // end::sqlObjectTransactionIsolation[]
@SqlQuery("SELECT * FROM users WHERE id=:id") @Transaction Optional<User> findUserById(int id); }
@Transaction default void insertInSingleTransaction(final int id, final String name) { insert(id, name); }
@Transaction(TransactionIsolationLevel.READ_COMMITTED) default Something insertAndFetch(int id, String name) { insert(id, name); return findById(id); }
@Transaction(TransactionIsolationLevel.READ_COMMITTED) default Something insertAndFetch(int id, String name) { insert(id, name); return findById(id); }
@Transaction(READ_UNCOMMITTED) default boolean transactionWithIsolation() { return getHandle().isInTransaction(); }
@Transaction(READ_UNCOMMITTED) @SqlQuery("select id, name from something where id = :id") Something findById(@Bind("id") int id); }
@Transaction(readOnly = true) default boolean verifyReadOnly() throws SQLException { final Handle h = getHandle(); if (h.isReadOnly() != h.getConnection().isReadOnly()) { throw new AssertionError("didn't set"); } return h.isReadOnly(); }
@Transaction default Something insertAndFind(int id, String name) { insert(id, name); return createBar().findById(id); }
@Transaction default Something insertAndFail(int id, String name) { insert(id, name); return createBar().explode(); } }
@Transaction @SqlUpdate("insert into something (id, name) values (:id, :name)") Integer insertTransactional(@Bind("id") int id, @Bind("name") String name);