📄 transactiontest.java
字号:
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 { abortTest(false); } public void testExplicitAbort() throws Exception { abortTest(true); } private void abortTest(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)); if (DbCompat.NESTED_TRANSACTIONS) { try { runner.run(new TransactionWorker() { public void doWork() throws Exception { final Transaction txn2 = currentTxn.getTransaction(); assertNotNull(txn2); assertTrue(txn1 != txn2); assertNull(map.put(TWO, TWO)); assertEquals(TWO, map.get(TWO)); if (explicit) { currentTxn.abortTransaction(); } else { throw new IllegalArgumentException( "test-abort"); } } }); assertTrue(explicit); } catch (IllegalArgumentException e) { assertTrue(!explicit); assertEquals("test-abort", e.getMessage()); } } Transaction txn3 = currentTxn.getTransaction(); assertSame(txn1, txn3); assertEquals(ONE, map.get(ONE)); assertNull(map.get(TWO)); } }); assertNull(currentTxn.getTransaction()); } public void testDirtyReadCollection() throws Exception { StoredSortedMap dirtyMap = (StoredSortedMap) StoredCollections.dirtyReadSortedMap(map); // original map is not dirty-read assertTrue(map.isDirtyReadAllowed()); assertTrue(!map.isDirtyRead()); // all dirty-read containers are dirty-read checkDirtyReadProperty(dirtyMap); checkDirtyReadProperty(StoredCollections.dirtyReadMap(map)); checkDirtyReadProperty(StoredCollections.dirtyReadCollection( map.values())); checkDirtyReadProperty(StoredCollections.dirtyReadSet( map.keySet())); checkDirtyReadProperty(StoredCollections.dirtyReadSortedSet( (SortedSet) map.keySet())); if (DbCompat.RECNO_METHOD) { // create a list just so we can call dirtyReadList() Database listStore = TestStore.RECNO_RENUM.open(env, null); List list = new StoredList(listStore, TestStore.VALUE_BINDING, true); checkDirtyReadProperty(StoredCollections.dirtyReadList(list)); listStore.close(); } doDirtyRead(dirtyMap); } private void checkDirtyReadProperty(Object container) { assertTrue(((StoredContainer) container).isDirtyReadAllowed()); assertTrue(((StoredContainer) container).isDirtyRead()); } public void testDirtyReadTransaction() throws Exception { TransactionRunner runner = new TransactionRunner(env); TransactionConfig config = new TransactionConfig(); config.setDirtyRead(true); runner.setTransactionConfig(config); assertNull(currentTxn.getTransaction()); runner.run(new TransactionWorker() { public void doWork() throws Exception { assertNotNull(currentTxn.getTransaction()); doDirtyRead(map); } }); assertNull(currentTxn.getTransaction()); } private synchronized void doDirtyRead(StoredSortedMap dirtyMap) throws Exception { // start thread one DirtyReadThreadOne t1 = new DirtyReadThreadOne(env, this); t1.start(); wait(); // put ONE synchronized (t1) { t1.notify(); } wait(); readCheck(dirtyMap, ONE, ONE); assertTrue(!dirtyMap.isEmpty()); // abort ONE synchronized (t1) { t1.notify(); } t1.join(); readCheck(dirtyMap, ONE, null); assertTrue(dirtyMap.isEmpty()); // start thread two DirtyReadThreadTwo t2 = new DirtyReadThreadTwo(env, this); t2.start(); wait(); // put TWO synchronized (t2) { t2.notify(); } wait(); readCheck(dirtyMap, TWO, TWO); assertTrue(!dirtyMap.isEmpty()); // commit TWO synchronized (t2) { t2.notify(); } t2.join(); readCheck(dirtyMap, TWO, TWO); assertTrue(!dirtyMap.isEmpty()); } private static class DirtyReadThreadOne extends Thread { private Environment env; private CurrentTransaction currentTxn; private TransactionTest parent; private StoredSortedMap map; private DirtyReadThreadOne(Environment env, TransactionTest parent) { this.env = env; this.currentTxn = CurrentTransaction.getInstance(env); this.parent = parent; this.map = parent.map; } public synchronized void run() { try { assertNull(currentTxn.getTransaction()); assertNotNull(currentTxn.beginTransaction(null)); assertNotNull(currentTxn.getTransaction()); readCheck(map, ONE, null); synchronized (parent) { parent.notify(); } wait(); // put ONE assertNull(map.put(ONE, ONE)); readCheck(map, ONE, ONE); synchronized (parent) { parent.notify(); } wait(); // abort ONE assertNull(currentTxn.abortTransaction()); assertNull(currentTxn.getTransaction()); } catch (Exception e) { throw new RuntimeExceptionWrapper(e); } } } private static class DirtyReadThreadTwo extends Thread { private Environment env; private CurrentTransaction currentTxn; private TransactionTest parent; private StoredSortedMap map; private DirtyReadThreadTwo(Environment env, TransactionTest parent) { this.env = env; this.currentTxn = CurrentTransaction.getInstance(env); this.parent = parent; this.map = parent.map; } public synchronized void run() { try { final TransactionRunner runner = new TransactionRunner(env); final Object thread = this; assertNull(currentTxn.getTransaction()); runner.run(new TransactionWorker() { public void doWork() throws Exception { assertNotNull(currentTxn.getTransaction()); readCheck(map, TWO, null); synchronized (parent) { parent.notify(); } thread.wait(); // put TWO assertNull(map.put(TWO, TWO)); readCheck(map, TWO, TWO); synchronized (parent) { parent.notify(); } thread.wait(); // commit TWO } }); assertNull(currentTxn.getTransaction()); } catch (Exception e) { throw new RuntimeExceptionWrapper(e); } } } private static void readCheck(StoredSortedMap checkMap, Object key, Object expect) { if (expect == null) { assertNull(checkMap.get(key)); assertTrue(checkMap.tailMap(key).isEmpty()); assertTrue(!checkMap.tailMap(key).containsKey(key)); assertTrue(!checkMap.keySet().contains(key)); assertTrue(checkMap.duplicates(key).isEmpty()); Iterator i = checkMap.keySet().iterator(); try { while (i.hasNext()) { assertTrue(!key.equals(i.next())); } } finally { StoredIterator.close(i); } } else { assertEquals(expect, checkMap.get(key)); assertEquals(expect, checkMap.tailMap(key).get(key)); assertTrue(!checkMap.tailMap(key).isEmpty()); assertTrue(checkMap.tailMap(key).containsKey(key)); assertTrue(checkMap.keySet().contains(key)); assertTrue(checkMap.values().contains(expect)); assertTrue(!checkMap.duplicates(key).isEmpty()); assertTrue(checkMap.duplicates(key).contains(expect)); Iterator i = checkMap.keySet().iterator(); try { boolean found = false; while (i.hasNext()) { if (expect.equals(i.next())) { found = true; } } assertTrue(found); } finally { StoredIterator.close(i); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -