提交 fbf19960 authored 作者: noelgrandin@gmail.com's avatar noelgrandin@gmail.com

Issue 581: When running in LOCK_MODE=0,

    JdbcDatabaseMetaData#supportsTransactionIsolationLevel(TRANSACTION_READ_UNCOMMITTED)
should return false
上级 df154436
...@@ -17,7 +17,9 @@ Change Log ...@@ -17,7 +17,9 @@ Change Log
<h1>Change Log</h1> <h1>Change Log</h1>
<h2>Next Version (unreleased)</h2> <h2>Next Version (unreleased)</h2>
<ul><li>- <ul><li>Issue 581: When running in LOCK_MODE=0,
JdbcDatabaseMetaData#supportsTransactionIsolationLevel(TRANSACTION_READ_UNCOMMITTED)
should return false
</li></ul> </li></ul>
<h2>Version 1.4.182 Beta (2014-10-17)</h2> <h2>Version 1.4.182 Beta (2014-10-17)</h2>
......
...@@ -2091,7 +2091,8 @@ public class Database implements DataHandler { ...@@ -2091,7 +2091,8 @@ public class Database implements DataHandler {
case Constants.LOCK_MODE_OFF: case Constants.LOCK_MODE_OFF:
if (multiThreaded) { if (multiThreaded) {
// currently the combination of LOCK_MODE=0 and MULTI_THREADED // currently the combination of LOCK_MODE=0 and MULTI_THREADED
// is not supported // is not supported. also see code in
// JdbcDatabaseMetaData#supportsTransactionIsolationLevel(int)
throw DbException.get( throw DbException.get(
ErrorCode.UNSUPPORTED_SETTING_COMBINATION, ErrorCode.UNSUPPORTED_SETTING_COMBINATION,
"LOCK_MODE=0 & MULTI_THREADED"); "LOCK_MODE=0 & MULTI_THREADED");
......
...@@ -2200,8 +2200,19 @@ public class JdbcDatabaseMetaData extends TraceObject implements ...@@ -2200,8 +2200,19 @@ public class JdbcDatabaseMetaData extends TraceObject implements
* @return true * @return true
*/ */
@Override @Override
public boolean supportsTransactionIsolationLevel(int level) { public boolean supportsTransactionIsolationLevel(int level) throws SQLException {
debugCodeCall("supportsTransactionIsolationLevel"); debugCodeCall("supportsTransactionIsolationLevel");
if (level == Connection.TRANSACTION_READ_UNCOMMITTED) {
// currently the combination of LOCK_MODE=0 and MULTI_THREADED
// is not supported, also see code in Database#setLockMode(int)
PreparedStatement prep = conn.prepareAutoCloseStatement(
"SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME=?");
prep.setString(1, "MULTI_THREADED");
ResultSet rs = prep.executeQuery();
if (rs.next() && rs.getString(1).equals("1")) {
return false;
}
}
return true; return true;
} }
......
...@@ -7,6 +7,7 @@ package org.h2.test.db; ...@@ -7,6 +7,7 @@ package org.h2.test.db;
import java.io.StringReader; import java.io.StringReader;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -58,6 +59,7 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -58,6 +59,7 @@ public class TestMultiThread extends TestBase implements Runnable {
testConcurrentAlter(); testConcurrentAlter();
testConcurrentAnalyze(); testConcurrentAnalyze();
testConcurrentInsertUpdateSelect(); testConcurrentInsertUpdateSelect();
testMetadataWith();
} }
private void testConcurrentLobAdd() throws Exception { private void testConcurrentLobAdd() throws Exception {
...@@ -244,4 +246,15 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -244,4 +246,15 @@ public class TestMultiThread extends TestBase implements Runnable {
} }
} }
private void testMetadataWith() throws Exception {
// currently the combination of LOCK_MODE=0 and MULTI_THREADED
// is not supported. also see code in
deleteDb("concurrentAnalyze");
final String url = getURL("concurrentAnalyze;MULTI_THREADED=1", true);
Connection conn = getConnection(url);
DatabaseMetaData dmd = conn.getMetaData();
assertFalse(dmd.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED));
conn.close();
deleteDb("concurrentAnalyze");
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论