Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

zhouhao 7 vuotta sitten
vanhempi
commit
4262301ac1

+ 1 - 1
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionSqlExecutor.java

@@ -9,7 +9,7 @@ import java.util.List;
 
 public interface TransactionSqlExecutor {
     /**
-     * 开启一个指定数据源的事务,并返回事务ID,在其他操作的时候,使用事务ID共享同一个事务
+     * 开启一个指定默认数据源的事务,并返回事务ID,在其他操作的时候,使用事务ID共享同一个事务
      *
      * @param datasourceId 数据源ID {@link DynamicDataSource#getId()}
      * @return 事务ID

+ 0 - 18
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/pom.xml

@@ -17,23 +17,5 @@
             <artifactId>hsweb-system-database-manager-api</artifactId>
             <version>${project.version}</version>
         </dependency>
-
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid</artifactId>
-            <version>1.0.26</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-tests</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>

+ 18 - 6
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java

@@ -18,6 +18,7 @@ import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -46,7 +47,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
 
     private TransactionTemplate transactionTemplate;
 
-    private boolean commit = false;
+    private volatile boolean commit = false;
 
     private volatile boolean running = false;
 
@@ -95,10 +96,16 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
 
     @Override
     public void rollback() {
-        shutdown = true;
+        tryRollback();
         waitToClose();
     }
 
+    private void tryRollback() {
+        running = false;
+        shutdown = true;
+        commit = false;
+    }
+
     public void setSqlExecutor(SqlExecutor sqlExecutor) {
         this.sqlExecutor = sqlExecutor;
     }
@@ -124,13 +131,17 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
             }
             while (!shutdown) {
                 logger.debug("wait sql execute request {}", transactionId);
-                waitToReady.await();//等待有新的sql进来
+                if (transactionTemplate.getTimeout() > 0) {
+                    waitToReady.await(transactionTemplate.getTimeout(), TimeUnit.MILLISECONDS);//等待有新的sql进来
+                } else {
+                    waitToReady.await();
+                }
                 waitToReady.reset();//重置,下一次循环继续等待
                 //执行sql
                 doExecute();
             }
         } catch (Exception e) {
-            rollback();//回滚
+            tryRollback();//回滚
             logger.error("execute sql error {}", transactionId, e);
         } finally {
             try {
@@ -175,8 +186,8 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
                 //通过回调返回执行结果
                 execution.callback.accept(requests);
             } catch (Exception e) {
-                rollback();
                 execution.onError.accept(e);
+                return;
             }
         }
         running = false;
@@ -194,7 +205,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
         //异常信息
         Exception[] exceptions = new Exception[1];
         Execution execution = new Execution();
-        execution.datasourceId=DataSourceHolder.switcher().currentDataSourceId();
+        execution.datasourceId = DataSourceHolder.switcher().currentDataSourceId();
 
         execution.request = request;
         execution.callback = sqlExecuteResults -> {
@@ -217,6 +228,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
         //判断是否有异常
         Exception exception;
         if ((exception = exceptions[0]) != null) {
+            rollback();
             throw exception;
         }
         return results;

+ 18 - 0
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/pom.xml

@@ -22,5 +22,23 @@
             <artifactId>hsweb-system-database-manager-web</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.0.26</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-tests</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

+ 3 - 1
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/test/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerServiceTest.java

@@ -8,6 +8,8 @@ import org.hswebframework.web.database.manager.SqlInfo;
 import org.hswebframework.web.tests.SimpleWebApplicationTests;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
 
 import java.sql.SQLException;
 import java.util.Arrays;
@@ -58,7 +60,7 @@ public class SimpleDatabaseManagerServiceTest extends SimpleWebApplicationTests
         countDownLatch.await();
 
         sqlInfo = new SqlInfo();
-        sqlInfo.setSql("select * from t_test");
+        sqlInfo.setSql("select * from t_test ");
         sqlInfo.setType("select");
 
         request.setSql(Arrays.asList(sqlInfo));

+ 1 - 1
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/test/resources/application.yml

@@ -9,7 +9,7 @@ spring:
        driver-class-name : org.h2.Driver
 hsweb:
     app:
-      name: 数据字典测试
+      name: 数据库管理测试
       version: 3.0.0
 logging:
   level:

+ 17 - 6
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/src/main/java/org/hswebframework/web/database/manager/web/DataBaseManagerController.java

@@ -56,9 +56,8 @@ public class DataBaseManagerController {
             @PathVariable @ApiParam("数据源ID") String datasourceId,
             @RequestBody @ApiParam("SQL脚本") String sqlLines) throws Exception {
 
-        DataSourceHolder.switcher().use(datasourceId);
         return ResponseMessage.ok(databaseManagerService.execute(SqlExecuteRequest.builder()
-                .sql(parseSql(sqlLines))
+                .sql(parseSql(sqlLines,datasourceId))
                 .build()));
 
     }
@@ -70,7 +69,7 @@ public class DataBaseManagerController {
                                                            @ApiParam("SQL脚本") String sqlLines) throws Exception {
         return ResponseMessage.ok(databaseManagerService
                 .execute(SqlExecuteRequest.builder()
-                        .sql(parseSql(sqlLines))
+                        .sql(parseSql(sqlLines,null))
                         .build()));
     }
 
@@ -80,7 +79,18 @@ public class DataBaseManagerController {
     public ResponseMessage<List<SqlExecuteResult>> executeTransactional(@PathVariable @ApiParam("事务ID") String transactionalId,
                                                                         @ApiParam("SQL脚本") @RequestBody String sqlLines) throws Exception {
         return ResponseMessage.ok(databaseManagerService.execute(transactionalId, SqlExecuteRequest.builder()
-                .sql(parseSql(sqlLines))
+                .sql(parseSql(sqlLines,null))
+                .build()));
+    }
+
+    @PostMapping(value = "/transactional/execute/{transactionalId}/{dataSourceId}", consumes = MediaType.TEXT_PLAIN_VALUE)
+    @Authorize(action = "execute", description = "执行SQL")
+    @ApiOperation(value = "开启事务执行指定数据源对SQL")
+    public ResponseMessage<List<SqlExecuteResult>> executeTransactional(@PathVariable @ApiParam("事务ID") String transactionalId,
+                                                                        @PathVariable @ApiParam("数据源ID") String dataSourceId,
+                                                                        @ApiParam("SQL脚本") @RequestBody String sqlLines) throws Exception {
+        return ResponseMessage.ok(databaseManagerService.execute(transactionalId, SqlExecuteRequest.builder()
+                .sql(parseSql(sqlLines,dataSourceId))
                 .build()));
     }
 
@@ -91,6 +101,7 @@ public class DataBaseManagerController {
         return ResponseMessage.ok(databaseManagerService.newTransaction());
     }
 
+
     @GetMapping("/transactional")
     @Authorize(action = "execute", description = "执行SQL")
     @ApiOperation("获取全部事务信息")
@@ -114,12 +125,12 @@ public class DataBaseManagerController {
         return ResponseMessage.ok();
     }
 
-    private List<SqlInfo> parseSql(String sqlText) {
+    private List<SqlInfo> parseSql(String sqlText,String datasourceId) {
         List<String> sqlList = Sqls.parse(sqlText);
         return sqlList.stream().map(sql -> {
             SqlInfo sqlInfo = new SqlInfo();
             sqlInfo.setSql(sql);
-            sqlInfo.setDatasourceId(DataSourceHolder.switcher().currentDataSourceId());
+            sqlInfo.setDatasourceId(datasourceId);
             sqlInfo.setType(sql.split("[ ]")[0].toLowerCase());
             return sqlInfo;
         }).collect(Collectors.toList());