#1689 - ENH: Add query usingTransaction() and usingConnection()

This commit is contained in:
rob bygrave
2019-04-30 20:13:12 +12:00
parent f94c3e81e5
commit 856a3a6fdd
9 changed files with 200 additions and 78 deletions
@@ -2,8 +2,8 @@ package org.tests.basic;
import io.ebean.AcquireLockException;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.DB;
import io.ebean.Database;
import io.ebean.Query;
import io.ebean.Transaction;
import io.ebean.annotation.ForPlatform;
@@ -30,7 +30,7 @@ public class TestQueryForUpdate extends BaseTestCase {
ResetBasicData.reset();
Query<Customer> query = Ebean.find(Customer.class)
Query<Customer> query = DB.find(Customer.class)
.forUpdate()
.order().desc("id");
@@ -49,16 +49,16 @@ public class TestQueryForUpdate extends BaseTestCase {
public void testForUpdate_when_alreadyInPC() {
EBasic basic = new EBasic("test PC cache");
Ebean.save(basic);
DB.save(basic);
try (Transaction transaction = Ebean.beginTransaction()) {
try (Transaction transaction = DB.beginTransaction()) {
LoggedSqlCollector.start();
EBasic basic0 = Ebean.find(EBasic.class, basic.getId());
EBasic basic0 = DB.find(EBasic.class, basic.getId());
assertThat(basic0).isNotNull();
EBasic basic1 = Ebean.find(EBasic.class)
EBasic basic1 = DB.find(EBasic.class)
.setId( basic.getId())
.forUpdate()
.findOne();
@@ -86,7 +86,7 @@ public class TestQueryForUpdate extends BaseTestCase {
ResetBasicData.reset();
Query<Customer> query = Ebean.find(Customer.class)
Query<Customer> query = DB.find(Customer.class)
.forUpdateNoWait()
.order().desc("id");
@@ -110,10 +110,10 @@ public class TestQueryForUpdate extends BaseTestCase {
ResetBasicData.reset();
EbeanServer server = Ebean.getDefaultServer();
Database server = DB.getDefault();
try (Transaction txn = Ebean.beginTransaction()) {
Query<Customer> query = Ebean.find(Customer.class)
try (Transaction txn = DB.beginTransaction()) {
Query<Customer> query = DB.find(Customer.class)
.forUpdateNoWait()
.setMaxRows(1)
.order().desc("id");
@@ -131,12 +131,12 @@ public class TestQueryForUpdate extends BaseTestCase {
// row is locked and we can't acquire it
try (Transaction txn2 = server.createTransaction()) {
logger.info("... attempt another acquire using 2nd transaction");
Query<Customer> query2 =
server.find(Customer.class)
.where().idEq(first.getId())
.forUpdateNoWait();
server.find(Customer.class)
.where().idEq(first.getId())
.forUpdateNoWait()
.usingTransaction(txn2)
.findOne();
server.extended().findOne(query2, txn2);
assertTrue(false); // never get here
} catch (AcquireLockException e) {
logger.info("... got AcquireLockException " + e);
@@ -0,0 +1,63 @@
package org.tests.basic;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Transaction;
import org.junit.Test;
import org.tests.model.basic.Country;
import org.tests.model.basic.ResetBasicData;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import static org.assertj.core.api.Assertions.assertThat;
public class TestQueryUsingConnection extends BaseTestCase {
@Test
public void usingConnection() throws SQLException {
ResetBasicData.reset();
DataSource dataSource = DB.getDefault().getPluginApi().getDataSource();
try (Connection connection = dataSource.getConnection()) {
int count = DB.find(Country.class)
.usingConnection(connection)
.findCount();
assertThat(count).isGreaterThan(0);
}
}
@Test
public void usingTransaction() {
ResetBasicData.reset();
try (Transaction transaction = DB.getDefault().createTransaction()) {
Transaction current = Transaction.current();
assertThat(current).isNull();
Country x = new Country();
x.setCode("xx");
x.setName("WillRollThisBack");
DB.getDefault().insert(x, transaction);
final int count = DB.find(Country.class)
.usingTransaction(transaction)
.findCount();
final int otherCount = DB.find(Country.class).findCount();
transaction.rollback();
assertThat(count).isEqualTo(otherCount + 1);
}
}
}
@@ -1,13 +1,13 @@
package org.tests.transaction;
import io.ebean.BaseTestCase;
import io.ebean.EbeanServer;
import io.ebean.EbeanServerFactory;
import io.ebean.Database;
import io.ebean.DatabaseFactory;
import io.ebean.Query;
import io.ebean.Transaction;
import io.ebean.annotation.ForPlatform;
import io.ebean.annotation.Platform;
import io.ebean.config.ServerConfig;
import io.ebean.config.DatabaseConfig;
import io.ebean.config.properties.PropertiesLoader;
import io.ebean.datasource.DataSourceConfig;
import io.ebean.datasource.DataSourcePool;
@@ -42,7 +42,7 @@ public class TestAutoCommitDataSource extends BaseTestCase {
assertTrue(connection.getAutoCommit());
connection.close();
ServerConfig config = new ServerConfig();
DatabaseConfig config = new DatabaseConfig();
config.setName("h2autocommit");
config.loadFromProperties();
config.setDataSource(pool);
@@ -57,9 +57,9 @@ public class TestAutoCommitDataSource extends BaseTestCase {
config.setAutoCommitMode(true);
EbeanServer ebeanServer = EbeanServerFactory.create(config);
Database database = DatabaseFactory.create(config);
Query<UTMaster> query = ebeanServer.find(UTMaster.class);
Query<UTMaster> query = database.find(UTMaster.class);
List<UTMaster> details = query.findList();
assertEquals(0, details.size());
@@ -68,28 +68,24 @@ public class TestAutoCommitDataSource extends BaseTestCase {
UTMaster bean3 = new UTMaster("three3");
// use a different transaction to do final query check
try (Transaction otherTxn = ebeanServer.createTransaction()) {
Transaction txn = ebeanServer.beginTransaction();
try {
try (Transaction otherTxn = database.createTransaction()) {
try (Transaction txn = database.beginTransaction()) {
assertTrue(txn.getConnection().getAutoCommit());
ebeanServer.save(bean1);
ebeanServer.save(bean2);
database.save(bean1);
database.save(bean2);
Query<UTMaster> query2 = ebeanServer.find(UTMaster.class);
details = ebeanServer.extended().findList(query2, otherTxn);
details = database.find(UTMaster.class)
.usingTransaction(otherTxn)
.findList();
assertEquals(2, details.size());
ebeanServer.save(bean3);
database.save(bean3);
txn.rollback();
} finally {
txn.end();
}
Query<UTMaster> query3 = ebeanServer.find(UTMaster.class);
details = ebeanServer.extended().findList(query3, otherTxn);
details = database.find(UTMaster.class)
.usingTransaction(otherTxn)
.findList();
assertEquals(3, details.size());
}
@@ -1,14 +1,14 @@
package org.tests.transaction;
import io.ebean.BaseTestCase;
import io.ebean.EbeanServer;
import io.ebean.EbeanServerFactory;
import io.ebean.Database;
import io.ebean.DatabaseFactory;
import io.ebean.Query;
import io.ebean.Transaction;
import io.ebean.annotation.ForPlatform;
import io.ebean.annotation.Platform;
import io.ebean.config.DatabaseConfig;
import io.ebean.config.JsonConfig;
import io.ebean.config.ServerConfig;
import io.ebean.config.properties.PropertiesLoader;
import io.ebean.datasource.DataSourceConfig;
import io.ebean.datasource.DataSourcePool;
@@ -46,7 +46,7 @@ public class TestExplicitTransactionMode extends BaseTestCase {
assertTrue(connection.getAutoCommit());
connection.close();
ServerConfig config = new ServerConfig();
DatabaseConfig config = new DatabaseConfig();
config.setName("h2autocommit2");
config.loadFromProperties();
config.setDataSource(pool);
@@ -61,44 +61,44 @@ public class TestExplicitTransactionMode extends BaseTestCase {
config.setDdlExtra(false);
config.addClass(ScalarTypeLocalDateAsString.class);
EbeanServer ebeanServer = EbeanServerFactory.create(config);
Database database = DatabaseFactory.create(config);
testJsonScalarType(ebeanServer);
testJsonScalarType(database);
Query<UTMaster> query = ebeanServer.find(UTMaster.class);
Query<UTMaster> query = database.find(UTMaster.class);
List<UTMaster> details = query.findList();
assertEquals(0, details.size());
UTMaster bean0 = new UTMaster("one0");
Transaction txn0 = ebeanServer.beginTransaction();
Transaction txn0 = database.beginTransaction();
try {
ebeanServer.save(bean0);
database.save(bean0);
txn0.rollback();
} finally {
txn0.end();
}
// rollback as expected
assertEquals(0, ebeanServer.find(UTMaster.class).findCount());
assertEquals(0, database.find(UTMaster.class).findCount());
UTMaster bean1 = new UTMaster("one1");
UTMaster bean2 = new UTMaster("two2");
UTMaster bean3 = new UTMaster("three3");
// use a different transaction to do final query check
try (Transaction otherTxn = ebeanServer.createTransaction()) {
try (Transaction otherTxn = database.createTransaction()) {
Transaction txn = ebeanServer.beginTransaction();
Transaction txn = database.beginTransaction();
try {
ebeanServer.save(bean1);
ebeanServer.save(bean2);
database.save(bean1);
database.save(bean2);
// not visible in other transaction
Query<UTMaster> query2 = ebeanServer.find(UTMaster.class);
details = ebeanServer.extended().findList(query2, otherTxn);
Query<UTMaster> query2 = database.find(UTMaster.class);
details = database.extended().findList(query2, otherTxn);
assertEquals(0, details.size());
ebeanServer.save(bean3);
database.save(bean3);
txn.commit();
@@ -107,13 +107,15 @@ public class TestExplicitTransactionMode extends BaseTestCase {
}
// commit as expected
Query<UTMaster> query3 = ebeanServer.find(UTMaster.class);
details = ebeanServer.extended().findList(query3, otherTxn);
details = database.find(UTMaster.class)
.usingTransaction(otherTxn)
.findList();
assertEquals(3, details.size());
}
}
private void testJsonScalarType(EbeanServer ebeanServer) {
private void testJsonScalarType(Database ebeanServer) {
UTMaster bean = new UTMaster("one1");
bean.setDate(LocalDate.of(2019, 04, 20));