/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.jdbc; import java.sql.Connection; import java.sql.SQLException; import org.h2.constant.ErrorCode; import org.h2.test.TestBase; /** * Transaction isolation level tests. */ public class TestTransactionIsolation extends TestBase { private Connection conn1, conn2; /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } public void test() throws SQLException { if (config.mvcc) { // no tests yet } else { testTableLevelLocking(); } } private void testTableLevelLocking() throws SQLException { deleteDb("transactionIsolation"); conn1 = getConnection("transactionIsolation"); assertEquals(Connection.TRANSACTION_READ_COMMITTED, conn1.getTransactionIsolation()); conn1.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); assertEquals(Connection.TRANSACTION_SERIALIZABLE, conn1.getTransactionIsolation()); conn1.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); assertEquals(Connection.TRANSACTION_READ_UNCOMMITTED, conn1.getTransactionIsolation()); assertSingleValue(conn1.createStatement(), "CALL LOCK_MODE()", 0); conn1.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); assertSingleValue(conn1.createStatement(), "CALL LOCK_MODE()", 3); assertEquals(Connection.TRANSACTION_READ_COMMITTED, conn1.getTransactionIsolation()); conn1.createStatement().execute("SET LOCK_MODE 1"); assertEquals(Connection.TRANSACTION_SERIALIZABLE, conn1.getTransactionIsolation()); conn1.createStatement().execute("CREATE TABLE TEST(ID INT)"); conn1.createStatement().execute("INSERT INTO TEST VALUES(1)"); conn1.setAutoCommit(false); conn2 = getConnection("transactionIsolation"); conn2.setAutoCommit(false); conn1.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); // serializable: just reading assertSingleValue(conn1.createStatement(), "SELECT * FROM TEST", 1); assertSingleValue(conn2.createStatement(), "SELECT * FROM TEST", 1); conn1.commit(); conn2.commit(); // serializable: write lock conn1.createStatement().executeUpdate("UPDATE TEST SET ID=2"); assertThrows(ErrorCode.LOCK_TIMEOUT_1, conn2.createStatement()). executeQuery("SELECT * FROM TEST"); conn1.commit(); conn2.commit(); conn1.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); // read-committed: #1 read, #2 update, #1 read again assertSingleValue(conn1.createStatement(), "SELECT * FROM TEST", 2); conn2.createStatement().executeUpdate("UPDATE TEST SET ID=3"); conn2.commit(); assertSingleValue(conn1.createStatement(), "SELECT * FROM TEST", 3); conn1.commit(); // read-committed: #1 read, #2 read, #2 update, #1 delete assertSingleValue(conn1.createStatement(), "SELECT * FROM TEST", 3); assertSingleValue(conn2.createStatement(), "SELECT * FROM TEST", 3); conn2.createStatement().executeUpdate("UPDATE TEST SET ID=4"); assertThrows(ErrorCode.LOCK_TIMEOUT_1, conn1.createStatement()). executeUpdate("DELETE FROM TEST"); conn2.commit(); conn1.commit(); assertSingleValue(conn1.createStatement(), "SELECT * FROM TEST", 4); assertSingleValue(conn2.createStatement(), "SELECT * FROM TEST", 4); conn1.close(); conn2.close(); deleteDb("transactionIsolation"); } }