更改事务隔离级别
通过更改事务隔离级别,您可以选择让事务以哪种方式防止来自其他事务的干扰。默认情况下,JDBC 驱动程序会匹配 Vertica 服务器的事务隔离级别。Vertica 的默认事务隔离级别是 READ_COMMITTED
,这意味着在提交由某个事务进行的任何更改之前,任何其他事务无法读取这些更改。此级别可防止事务读取由稍后回退的其他事务插入的数据。
Vertica 还支持 SERIALIZABLE
事务隔离级别。此级别可锁定表,以防止其他事务更改查询的 WHERE
子句的结果。锁定表会产生性能影响,因为一次只有一个事务能够访问该表。
事务将保留其隔离级别直至其完成,即使在事务处理期间会话的隔离级别发生更改也是如此。Vertica 内部进程(例如 Tuple Mover 和 刷新操作)以及 DDL 操作始终以 SERIALIZABLE 隔离级别运行以确保一致性。
建立了连接之后,您可以使用 Connection
对象的 setter (setTransactionIsolation()
) 和 getter (getTransactionIsolation()
) 更改事务隔离级别的连接属性。事务隔离属性的值是一个整数。Connection
接口定义了一些常数,这些常数有助于以更直观的方式设置值:
注意
Connection
接口还定义了另外两个事务隔离常数(READ_UNCOMMITTED
和 REPEATABLE_READ
)。由于 Vertica 不支持这些隔离级别,因此它们分别转换为 READ_COMMITTED
和 SERIALIZABLE
。
以下示例演示了将事务隔离级别设置为 SERIALIZABLE。
import java.sql.*;
import java.util.Properties;
public class SetTransactionIsolation {
public static void main(String[] args) {
Properties myProp = new Properties();
myProp.put("user", "ExampleUser");
myProp.put("password", "password123");
Connection conn;
try {
conn = DriverManager.getConnection(
"jdbc:vertica://VerticaHost:5433/ExampleDB",
myProp);
// Get default transaction isolation
System.out.println("Transaction Isolation Level: "
+ conn.getTransactionIsolation());
// Set transaction isolation to SERIALIZABLE
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// Get the transaction isolation again
System.out.println("Transaction Isolation Level: "
+ conn.getTransactionIsolation());
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行此示例后,以下内容会输出到控制台:
Transaction Isolation Level: 2Transaction Isolation Level: 8