⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transactiontest.java

📁 berkeleyDB,强大的嵌入式数据,多个数据库的内核
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                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 + -