📄 transactiontest.java
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002-2006 * Oracle Corporation. All rights reserved. * * $Id: TransactionTest.java,v 12.7 2006/08/24 14:46:47 bostic Exp $ */package com.sleepycat.collections.test;import java.util.Iterator;import java.util.List;import java.util.SortedSet;import junit.framework.Test;import junit.framework.TestCase;import junit.framework.TestSuite;import com.sleepycat.collections.CurrentTransaction;import com.sleepycat.collections.StoredCollections;import com.sleepycat.collections.StoredContainer;import com.sleepycat.collections.StoredIterator;import com.sleepycat.collections.StoredList;import com.sleepycat.collections.StoredSortedMap;import com.sleepycat.collections.TransactionRunner;import com.sleepycat.collections.TransactionWorker;import com.sleepycat.compat.DbCompat;import com.sleepycat.db.CursorConfig;import com.sleepycat.db.Database;import com.sleepycat.db.DatabaseConfig;import com.sleepycat.db.DatabaseEntry;import com.sleepycat.db.Environment;import com.sleepycat.db.Transaction;import com.sleepycat.db.TransactionConfig;import com.sleepycat.util.RuntimeExceptionWrapper;/** * @author Mark Hayes */public class TransactionTest extends TestCase { private static final Long ONE = new Long(1); private static final Long TWO = new Long(2); private static final Long THREE = new Long(3); /** * Runs a command line collection test. * @see #usage */ public static void main(String[] args) throws Exception { if (args.length == 1 && (args[0].equals("-h") || args[0].equals("-help"))) { usage(); } else { junit.framework.TestResult tr = junit.textui.TestRunner.run(suite()); if (tr.errorCount() > 0 || tr.failureCount() > 0) { System.exit(1); } else { System.exit(0); } } } private static void usage() { System.out.println( "Usage: java com.sleepycat.collections.test.TransactionTest" + " [-h | -help]\n"); System.exit(2); } public static Test suite() throws Exception { TestSuite suite = new TestSuite(TransactionTest.class); return suite; } private Environment env; private CurrentTransaction currentTxn; private Database store; private StoredSortedMap map; private TestStore testStore = TestStore.BTREE_UNIQ; public TransactionTest(String name) { super(name); } public void setUp() throws Exception { DbTestUtil.printTestName(DbTestUtil.qualifiedTestName(this)); env = TestEnv.TXN.open("TransactionTests"); currentTxn = CurrentTransaction.getInstance(env); store = testStore.open(env, dbName(0)); map = new StoredSortedMap(store, testStore.getKeyBinding(), testStore.getValueBinding(), true); } public void tearDown() { try { if (store != null) { store.close(); } if (env != null) { env.close(); } } catch (Exception e) { System.out.println("Ignored exception during tearDown: " + e); } finally { /* Ensure that GC can cleanup. */ store = null; env = null; currentTxn = null; map = null; testStore = null; } } private String dbName(int i) { return "txn-test-" + getName() + '-' + i; } public void testGetters() throws Exception { assertNotNull(env); assertNotNull(currentTxn); assertNull(currentTxn.getTransaction()); currentTxn.beginTransaction(null); assertNotNull(currentTxn.getTransaction()); currentTxn.commitTransaction(); assertNull(currentTxn.getTransaction()); currentTxn.beginTransaction(null); assertNotNull(currentTxn.getTransaction()); currentTxn.abortTransaction(); assertNull(currentTxn.getTransaction()); // read-uncommitted property should be inherited assertTrue(!isReadUncommitted(map)); assertTrue(!isReadUncommitted(map.values())); assertTrue(!isReadUncommitted(map.keySet())); assertTrue(!isReadUncommitted(map.entrySet())); StoredSortedMap other = (StoredSortedMap) StoredCollections.configuredMap (map, CursorConfig.READ_UNCOMMITTED); assertTrue(isReadUncommitted(other)); assertTrue(isReadUncommitted(other.values())); assertTrue(isReadUncommitted(other.keySet())); assertTrue(isReadUncommitted(other.entrySet())); assertTrue(!isReadUncommitted(map)); assertTrue(!isReadUncommitted(map.values())); assertTrue(!isReadUncommitted(map.keySet())); assertTrue(!isReadUncommitted(map.entrySet())); // read-committed property should be inherited assertTrue(!isReadCommitted(map)); assertTrue(!isReadCommitted(map.values())); assertTrue(!isReadCommitted(map.keySet())); assertTrue(!isReadCommitted(map.entrySet())); other = (StoredSortedMap) StoredCollections.configuredMap (map, CursorConfig.READ_COMMITTED); assertTrue(isReadCommitted(other)); assertTrue(isReadCommitted(other.values())); assertTrue(isReadCommitted(other.keySet())); assertTrue(isReadCommitted(other.entrySet())); assertTrue(!isReadCommitted(map)); assertTrue(!isReadCommitted(map.values())); assertTrue(!isReadCommitted(map.keySet())); assertTrue(!isReadCommitted(map.entrySet())); } public void testTransactional() throws Exception { // is transactional because DB_AUTO_COMMIT was passed to // Database.open() // assertTrue(map.isTransactional()); store.close(); store = null; // is not transactional // DatabaseConfig dbConfig = new DatabaseConfig(); DbCompat.setTypeBtree(dbConfig); dbConfig.setAllowCreate(true); Database db = DbCompat.openDatabase(env, null, dbName(1), null, dbConfig); map = new StoredSortedMap(db, testStore.getKeyBinding(), testStore.getValueBinding(), true); assertTrue(!map.isTransactional()); map.put(ONE, ONE); readCheck(map, ONE, ONE); db.close(); // is transactional // dbConfig.setTransactional(true); currentTxn.beginTransaction(null); db = DbCompat.openDatabase(env, currentTxn.getTransaction(), dbName(2), null, dbConfig); currentTxn.commitTransaction(); map = new StoredSortedMap(db, testStore.getKeyBinding(), testStore.getValueBinding(), true); assertTrue(map.isTransactional()); currentTxn.beginTransaction(null); map.put(ONE, ONE); readCheck(map, ONE, ONE); currentTxn.commitTransaction(); db.close(); } public void testExceptions() throws Exception { try { currentTxn.commitTransaction(); fail(); } catch (IllegalStateException expected) {} try { currentTxn.abortTransaction(); fail(); } catch (IllegalStateException expected) {} } public void testNested() throws Exception { if (!DbCompat.NESTED_TRANSACTIONS) { return; } assertNull(currentTxn.getTransaction()); Transaction txn1 = currentTxn.beginTransaction(null); assertNotNull(txn1); assertTrue(txn1 == currentTxn.getTransaction()); assertNull(map.get(ONE)); assertNull(map.put(ONE, ONE)); assertEquals(ONE, map.get(ONE)); Transaction txn2 = currentTxn.beginTransaction(null); assertNotNull(txn2); assertTrue(txn2 == currentTxn.getTransaction()); assertTrue(txn1 != txn2); assertNull(map.put(TWO, TWO)); assertEquals(TWO, map.get(TWO)); Transaction txn3 = currentTxn.beginTransaction(null); assertNotNull(txn3); assertTrue(txn3 == currentTxn.getTransaction()); assertTrue(txn1 != txn2); assertTrue(txn1 != txn3); assertTrue(txn2 != txn3); assertNull(map.put(THREE, THREE)); assertEquals(THREE, map.get(THREE)); Transaction txn = currentTxn.abortTransaction(); assertTrue(txn == txn2); assertTrue(txn == currentTxn.getTransaction()); assertNull(map.get(THREE)); assertEquals(TWO, map.get(TWO)); txn3 = currentTxn.beginTransaction(null); assertNotNull(txn3); assertTrue(txn3 == currentTxn.getTransaction()); assertTrue(txn1 != txn2); assertTrue(txn1 != txn3); assertTrue(txn2 != txn3); assertNull(map.put(THREE, THREE)); assertEquals(THREE, map.get(THREE)); txn = currentTxn.commitTransaction(); assertTrue(txn == txn2); assertTrue(txn == currentTxn.getTransaction()); assertEquals(THREE, map.get(THREE)); assertEquals(TWO, map.get(TWO)); txn = currentTxn.commitTransaction(); assertTrue(txn == txn1); assertTrue(txn == currentTxn.getTransaction()); assertEquals(THREE, map.get(THREE)); assertEquals(TWO, map.get(TWO)); assertEquals(ONE, map.get(ONE)); txn = currentTxn.commitTransaction(); assertNull(txn); assertNull(currentTxn.getTransaction()); assertEquals(THREE, map.get(THREE)); assertEquals(TWO, map.get(TWO)); assertEquals(ONE, map.get(ONE)); } public void testRunnerCommit() throws Exception { commitTest(false); } public void testExplicitCommit() throws Exception { commitTest(true); } private void commitTest(final boolean explicit) throws Exception { final TransactionRunner runner = new TransactionRunner(env); runner.setAllowNestedTransactions(DbCompat.NESTED_TRANSACTIONS); assertNull(currentTxn.getTransaction()); runner.run(new TransactionWorker() { public void doWork() throws Exception { final Transaction txn1 = currentTxn.getTransaction(); assertNotNull(txn1); assertNull(map.put(ONE, ONE)); assertEquals(ONE, map.get(ONE)); runner.run(new TransactionWorker() { public void doWork() throws Exception { final Transaction txn2 = currentTxn.getTransaction(); assertNotNull(txn2); if (DbCompat.NESTED_TRANSACTIONS) { assertTrue(txn1 != txn2); } else { assertTrue(txn1 == txn2); } assertNull(map.put(TWO, TWO)); assertEquals(TWO, map.get(TWO)); assertEquals(ONE, map.get(ONE)); if (DbCompat.NESTED_TRANSACTIONS && explicit) { currentTxn.commitTransaction(); } } }); Transaction txn3 = currentTxn.getTransaction(); assertSame(txn1, txn3); assertEquals(TWO, map.get(TWO)); assertEquals(ONE, map.get(ONE)); } }); assertNull(currentTxn.getTransaction()); } public void testRunnerAbort() throws Exception {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -