001: // Copyright (c) 2003-2007, Jodd Team (jodd.sf.net). All Rights Reserved.
002:
003: package jodd.db;
004:
005: import junit.framework.TestCase;
006: import jodd.db.pool.CoreConnectionPool;
007: import jodd.db.jtx.DbJtxResourceManager;
008: import jodd.db.jtx.DbJtxTransactionManager;
009: import jodd.jtx.JtxTransactionManager;
010: import jodd.jtx.JtxTransaction;
011: import jodd.jtx.JtxTransactionMode;
012:
013: import java.sql.ResultSet;
014: import java.sql.SQLException;
015:
016: public class DbTransationTest extends TestCase {
017:
018: DbJtxTransactionManager tm;
019: CoreConnectionPool pool;
020:
021: @Override
022: protected void setUp() throws Exception {
023: super .setUp();
024: //noinspection NonConstantStringShouldBeStringBuffer
025: String dbFile = System.getProperty("prj.build.dir");
026: if (dbFile == null) {
027: dbFile = "";
028: }
029: dbFile += "/db/jodd-db";
030: pool = new CoreConnectionPool();
031: pool.setDriver("org.hsqldb.jdbcDriver");
032: pool.setUrl("jdbc:hsqldb:" + dbFile);
033: pool.setUser("sa");
034: pool.setPassword("");
035: pool.init();
036: tm = new DbJtxTransactionManager();
037: tm.createDbResourceManager(pool);
038: }
039:
040: @Override
041: protected void tearDown() throws Exception {
042: super .tearDown();
043: tm.close();
044: }
045:
046: // ---------------------------------------------------------------- misc
047:
048: public void testIsolation() throws SQLException {
049:
050: JtxTransactionManager manager = new JtxTransactionManager();
051: manager.registerResourceManager(new DbJtxResourceManager(pool,
052: "db"));
053:
054: JtxTransaction tx1 = manager
055: .requestTransaction(new JtxTransactionMode()
056: .propagationRequired().setReadOnly(false));
057: DbSession session1 = (DbSession) tx1.getResource("db");
058: assertNotNull(session1);
059: JtxTransaction tx2 = manager
060: .requestTransaction(new JtxTransactionMode()
061: .propagationNotSupported());
062: DbSession session2 = (DbSession) tx2.getResource("db");
063: assertNotNull(session2);
064:
065: assertNotSame(session1, session2);
066: assertEquals(2, manager.totalTransactions());
067: assertEquals(1, manager.totalActiveTransactions());
068:
069: DbQuery query = new DbQuery(session1,
070: "insert into GIRLS values(4, 'Jeniffer', 'fighting')");
071: assertEquals(1, query.executeUpdate());
072: query.close();
073:
074: DbQuery query2 = new DbQuery(session2,
075: "select count(*) from GIRLS");
076: ResultSet rs = query2.execute();
077: if (rs.next()) {
078: assertEquals(4, rs.getInt(1));
079: }
080:
081: session1.rollbackTransaction();
082:
083: rs = query2.execute();
084: if (rs.next()) {
085: assertEquals(3, rs.getInt(1));
086: }
087: rs.close();
088:
089: //tx2.commit();
090: //tx1.commit();
091: manager.commitAll();
092: assertEquals(0, manager.totalTransactions());
093: }
094:
095: // ---------------------------------------------------------------- presentation layer
096:
097: public void testAction() {
098: assertNotNull(tm);
099: service0();
100: JtxTransaction tx1 = service1();
101: service2(tx1);
102: service3(tx1);
103: tm.commitAll();
104: assertEquals(0, tm.totalActiveTransactions());
105: assertEquals(0, tm.totalTransactions());
106: }
107:
108: // ---------------------------------------------------------------- service layer
109:
110: DbSession s0;
111:
112: void service0() {
113: assertFalse(tm.isUnderTransaction());
114: assertEquals(0, tm.totalTransactions());
115: JtxTransaction tx = tm
116: .createTransaction(new JtxTransactionMode());
117: assertTrue(tm.isUnderTransaction());
118: assertFalse(tm.isUnderActiveTransaction());
119: assertEquals(1, tm.totalTransactions());
120: tx.begin();
121: assertTrue(tm.isUnderActiveTransaction());
122: s0 = anyDao();
123: service0_1(tx);
124: assertTrue(tm.isUnderActiveTransaction());
125: assertTrue(tm.isUnderTransaction());
126: tx.commit();
127: assertFalse(tm.isUnderActiveTransaction());
128: assertFalse(tm.isUnderTransaction());
129: assertEquals(0, tm.totalTransactions());
130: }
131:
132: void service0_1(JtxTransaction uptx) {
133: assertTrue(tm.isUnderTransaction());
134: assertTrue(tm.isUnderActiveTransaction());
135: JtxTransaction tx = tm.getTransaction();
136: assertTrue(tm.isUnderActiveTransaction());
137: assertTrue(tm.isUnderTransaction());
138: assertEquals(1, tm.totalTransactions());
139: assertEquals(uptx, tx);
140: assertEquals(s0, anyDao());
141: }
142:
143: // ---------------------------------------------------------------- service layer
144:
145: DbSession s1;
146:
147: // service #1 REQUIRED
148: JtxTransaction service1() {
149: assertFalse(tm.isUnderTransaction());
150: JtxTransaction tx = tm
151: .requestTransaction(new JtxTransactionMode()
152: .propagationRequired());
153: assertTrue(tm.isUnderTransaction());
154: assertTrue(tm.isUnderActiveTransaction());
155: assertEquals(1, tm.totalActiveTransactions());
156: assertEquals(1, tm.totalTransactions());
157: s1 = anyDao();
158: return tx;
159: }
160:
161: // service #2 REQUIRES NEW
162: void service2(JtxTransaction tx1) {
163: assertTrue(tm.isUnderTransaction());
164: assertTrue(tm.isUnderActiveTransaction());
165: JtxTransaction tx = tm
166: .requestTransaction(new JtxTransactionMode()
167: .propagationRequiresNew());
168: assertTrue(tm.isUnderTransaction());
169: assertTrue(tm.isUnderActiveTransaction());
170: assertEquals(2, tm.totalActiveTransactions());
171: assertEquals(2, tm.totalTransactions());
172: assertNotSame(tx1, tx);
173: assertNotSame(s1, anyDao());
174: assertTrue(tm.isUnderTransaction());
175: assertTrue(tm.isUnderActiveTransaction());
176: tx.commit();
177: assertTrue(tm.isUnderTransaction());
178: assertTrue(tm.isUnderActiveTransaction());
179: }
180:
181: // service #3 REQUIRED
182: void service3(JtxTransaction tx1) {
183: assertTrue(tm.isUnderTransaction());
184: assertTrue(tm.isUnderActiveTransaction());
185: JtxTransaction tx = tm
186: .requestTransaction(new JtxTransactionMode()
187: .propagationRequired());
188: assertTrue(tm.isUnderTransaction());
189: assertTrue(tm.isUnderActiveTransaction());
190: assertEquals(tx1, tx);
191: assertEquals(1, tm.totalActiveTransactions());
192: assertEquals(1, tm.totalTransactions());
193: assertEquals(s1, anyDao());
194: service3_1(tx);
195: assertEquals(s1, anyDao());
196: assertTrue(tm.isUnderTransaction());
197: assertTrue(tm.isUnderActiveTransaction());
198: }
199:
200: // service #3_1 NOT SUPPORTED
201: void service3_1(JtxTransaction tx3) {
202: assertTrue(tm.isUnderTransaction());
203: assertTrue(tm.isUnderActiveTransaction());
204: JtxTransaction tx = tm
205: .requestTransaction(new JtxTransactionMode()
206: .propagationNotSupported());
207: assertTrue(tm.isUnderTransaction());
208: assertFalse(tm.isUnderActiveTransaction());
209: assertNotSame(tx3, tx);
210: assertEquals(1, tm.totalActiveTransactions());
211: assertEquals(2, tm.totalTransactions());
212: assertNotSame(s1, anyDao());
213: assertNotSame(s1, anyDao());
214: assertTrue(tm.isUnderTransaction());
215: assertFalse(tm.isUnderActiveTransaction());
216: tx.commit();
217: assertTrue(tm.isUnderTransaction());
218: assertTrue(tm.isUnderActiveTransaction());
219: }
220:
221: // ---------------------------------------------------------------- dao layer
222:
223: DbSession anyDao() {
224: DbSession session1 = tm.getDbSession();
225: DbSession session2 = (DbSession) tm
226: .getResource(DbJtxResourceManager.DEFAULT_RESOURCE_TYPE);
227: assertEquals(session1, session2);
228: return session1;
229: }
230:
231: }
|