Skip to content

Commit 07188c0

Browse files
author
core-lib
committed
事务隔离级别不重复设置
1 parent 026e872 commit 07188c0

3 files changed

Lines changed: 75 additions & 17 deletions

File tree

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package io.sqlman.version;
2+
3+
import java.sql.Connection;
4+
import java.util.Set;
5+
6+
/**
7+
* JDBC事务隔离级别
8+
*
9+
* @author Payne 646742615@qq.com
10+
* 2019/6/1 10:34
11+
*/
12+
public enum JdbcIsolation implements JdbcInstruction {
13+
14+
/**
15+
* 隔离级别:读未提交
16+
*/
17+
READ_UNCOMMITTED(INSTRUCTION_READ_UNCOMMITTED, "read uncommitted", Connection.TRANSACTION_READ_UNCOMMITTED),
18+
/**
19+
* 隔离级别:读已提交
20+
*/
21+
READ_COMMITTED(INSTRUCTION_READ_COMMITTED, "read committed", Connection.TRANSACTION_READ_COMMITTED),
22+
/**
23+
* 隔离级别:可重复读
24+
*/
25+
REPEATABLE_READ(INSTRUCTION_REPEATABLE_READ, "repeatable read", Connection.TRANSACTION_REPEATABLE_READ),
26+
/**
27+
* 隔离级别:串行执行
28+
*/
29+
SERIALIZABLE(INSTRUCTION_SERIALIZABLE, "serializable", Connection.TRANSACTION_SERIALIZABLE);
30+
31+
/**
32+
* 指令
33+
*/
34+
public final String instruction;
35+
/**
36+
* 隔离级别名称
37+
*/
38+
public final String name;
39+
/**
40+
* JDBC Connection 隔离级别
41+
*/
42+
public final int level;
43+
44+
JdbcIsolation(String instruction, String name, int level) {
45+
this.instruction = instruction;
46+
this.name = name;
47+
this.level = level;
48+
}
49+
50+
/**
51+
* 从指令集中获取隔离级别,如果没有隔离级别指令则返回{@code null}
52+
*
53+
* @param instructions 指令集
54+
* @return 对应隔离级别或{@code null}当没有隔离级别指令时
55+
*/
56+
public static JdbcIsolation valueOf(Set<String> instructions) {
57+
if (instructions == null || instructions.isEmpty()) {
58+
return null;
59+
}
60+
for (JdbcIsolation value : values()) {
61+
if (instructions.contains(value.instruction)) {
62+
return value;
63+
}
64+
}
65+
return null;
66+
}
67+
68+
@Override
69+
public String toString() {
70+
return name;
71+
}
72+
}

src/main/java/io/sqlman/version/JdbcVersionManager.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -129,22 +129,10 @@ public void upgrade(final SqlScript script, final int ordinal) throws SQLExcepti
129129
@Override
130130
public Integer execute(Connection connection) throws SQLException {
131131
try {
132-
String isolation;
133132
Set<String> instructions = script.instructions();
134-
if (instructions != null && instructions.contains(INSTRUCTION_SERIALIZABLE)) {
135-
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
136-
isolation = "serializable";
137-
} else if (instructions != null && instructions.contains(INSTRUCTION_REPEATABLE_READ)) {
138-
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
139-
isolation = "repeatable read";
140-
} else if (instructions != null && instructions.contains(INSTRUCTION_READ_COMMITTED)) {
141-
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
142-
isolation = "read committed";
143-
} else if (instructions != null && instructions.contains(INSTRUCTION_READ_UNCOMMITTED)) {
144-
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
145-
isolation = "read uncommitted";
146-
} else {
147-
isolation = "default";
133+
JdbcIsolation isolation = JdbcIsolation.valueOf(instructions);
134+
if (isolation != null && connection.getTransactionIsolation() != isolation.level) {
135+
connection.setTransactionIsolation(isolation.level);
148136
}
149137

150138
SqlSentence sentence = script.sentence(ordinal);

src/test/resources/sqlman/v1.0.1-ATOMIC!插入数据.sql renamed to src/test/resources/sqlman/v1.0.1-ATOMIC-READ_COMMITTED!插入数据.sql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
2-
31
INSERT INTO SQLMAN_TEST1 (ID)
42
VALUES (1);
53
INSERT INTO SQLMAN_TEST2 (ID)

0 commit comments

Comments
 (0)