新增事务测试代码
This commit is contained in:
@@ -41,15 +41,16 @@ jdbc:
|
|||||||
maxEvictableIdleTimeMillis: 1800000
|
maxEvictableIdleTimeMillis: 1800000
|
||||||
|
|
||||||
# 是否自动回收泄露的连接和超时时间,单位秒(35分钟)(4.0.6+)
|
# 是否自动回收泄露的连接和超时时间,单位秒(35分钟)(4.0.6+)
|
||||||
removeAbandoned: true
|
removeAbandoned: false
|
||||||
removeAbandonedTimeout: 2100
|
removeAbandonedTimeout: 2100
|
||||||
|
|
||||||
# Oracle 下会自动开启 PSCache,并指定每个连接上 PSCache 大小。若不指定,则与 maxActive 相同(4.1.5+)
|
# Oracle 下会自动开启 PSCache,并指定每个连接上 PSCache 大小。若不指定,则与 maxActive 相同(4.1.5+)
|
||||||
maxPoolPreparedStatementPerConnectionSize: ~
|
maxPoolPreparedStatementPerConnectionSize: ~
|
||||||
|
|
||||||
# JTA 分布式事务(v4.0.4+)
|
# JTA 分布式事务,建议启用多数据源的时候开启(v4.0.4+)
|
||||||
jta:
|
jta:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|
||||||
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下:
|
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下:
|
||||||
# grant select on sys.dba_pending_transactions to jeesite;
|
# grant select on sys.dba_pending_transactions to jeesite;
|
||||||
# grant select on sys.pending_trans$ to jeesite;
|
# grant select on sys.pending_trans$ to jeesite;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import com.jeesite.common.entity.Page;
|
import com.jeesite.common.entity.Page;
|
||||||
|
import com.jeesite.common.idgen.IdGen;
|
||||||
import com.jeesite.common.lang.DateUtils;
|
import com.jeesite.common.lang.DateUtils;
|
||||||
import com.jeesite.common.service.CrudService;
|
import com.jeesite.common.service.CrudService;
|
||||||
import com.jeesite.modules.file.utils.FileUploadUtils;
|
import com.jeesite.modules.file.utils.FileUploadUtils;
|
||||||
@@ -126,4 +127,30 @@ public class TestDataService extends CrudService<TestDataDao, TestData> {
|
|||||||
+ ", l: " + l + ", f: " + f + ", d: " + d + ", s: " + s);
|
+ ", l: " + l + ", f: " + f + ", d: " + d + ", s: " + s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事务测试,若 Child 报错,则回滚
|
||||||
|
*/
|
||||||
|
@Transactional(readOnly=false/*, propagation=Propagation.NOT_SUPPORTED*/)
|
||||||
|
public void transTest(TestData testData) {
|
||||||
|
testData.setTestInput("transTest");
|
||||||
|
testData.setTestTextarea(IdGen.randomBase62(5));
|
||||||
|
dao.insert(testData);
|
||||||
|
TestDataChild testDataChild = new TestDataChild();
|
||||||
|
testDataChild.setTestData(testData);
|
||||||
|
// 设置一个超出数据库范围的值,抛出数据库异常
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i=0; i<500; i++){
|
||||||
|
sb.append("transTest" + i);
|
||||||
|
}
|
||||||
|
testDataChild.setTestInput(sb.toString());
|
||||||
|
testDataChildDao.insert(testDataChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事务验证,返回空,则事务回滚成功
|
||||||
|
*/
|
||||||
|
public boolean transValid(TestData testData) {
|
||||||
|
return dao.get(testData) == null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -120,4 +120,20 @@ public class TestDataController extends BaseController {
|
|||||||
return renderResult(Global.TRUE, text("删除数据成功!"));
|
return renderResult(Global.TRUE, text("删除数据成功!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事务测试
|
||||||
|
*/
|
||||||
|
@RequiresPermissions("test:testData:edit")
|
||||||
|
@RequestMapping(value = "transTest")
|
||||||
|
@ResponseBody
|
||||||
|
public String transTest(TestData testData) {
|
||||||
|
try{
|
||||||
|
testDataService.transTest(testData);
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.debug("事务测试信息,报错回滚:" + e.getMessage());
|
||||||
|
}
|
||||||
|
boolean bl = testDataService.transValid(testData);
|
||||||
|
return renderResult(Global.TRUE, "事务测试"+(bl?"成功,数据已":"失败,数据未")+"回滚!");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ jdbc:
|
|||||||
# maxEvictableIdleTimeMillis: 1800000
|
# maxEvictableIdleTimeMillis: 1800000
|
||||||
#
|
#
|
||||||
# # 是否自动回收泄露的连接和超时时间,单位秒(35分钟)(4.0.6+)
|
# # 是否自动回收泄露的连接和超时时间,单位秒(35分钟)(4.0.6+)
|
||||||
# removeAbandoned: true
|
# removeAbandoned: false
|
||||||
# removeAbandonedTimeout: 2100
|
# removeAbandonedTimeout: 2100
|
||||||
#
|
#
|
||||||
# # Oracle 下会自动开启 PSCache,并指定每个连接上 PSCache 大小。若不指定,则与 maxActive 相同(4.1.5+)
|
# # Oracle 下会自动开启 PSCache,并指定每个连接上 PSCache 大小。若不指定,则与 maxActive 相同(4.1.5+)
|
||||||
@@ -124,9 +124,10 @@ jdbc:
|
|||||||
# minIdle: 3
|
# minIdle: 3
|
||||||
# maxActive: 20
|
# maxActive: 20
|
||||||
|
|
||||||
# # JTA 分布式事务(v4.0.4+)
|
# # JTA 分布式事务,建议启用多数据源的时候开启(v4.0.4+)
|
||||||
# jta:
|
# jta:
|
||||||
# enabled: false
|
# enabled: false
|
||||||
|
|
||||||
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下:
|
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下:
|
||||||
# grant select on sys.dba_pending_transactions to jeesite;
|
# grant select on sys.dba_pending_transactions to jeesite;
|
||||||
# grant select on sys.pending_trans$ to jeesite;
|
# grant select on sys.pending_trans$ to jeesite;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<% if(hasPermi('test:testData:edit')){ %>
|
<% if(hasPermi('test:testData:edit')){ %>
|
||||||
<a href="${ctx}/test/testData/form" class="btn btn-default btnTool" title="${text('新增数据')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
<a href="${ctx}/test/testData/form" class="btn btn-default btnTool" title="${text('新增数据')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
<a href="#" class="btn btn-default" id="btnTrunsTest" title="事务测试"><i class="fa fa-refresh"></i> 事务测试</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
@@ -175,5 +176,12 @@ $('#dataGrid').dataGrid({
|
|||||||
// $("#dataGrid").parent().append("<div class=\"ml10\">没有符合数据</div>");
|
// $("#dataGrid").parent().append("<div class=\"ml10\">没有符合数据</div>");
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
$("#btnTrunsTest").click(function(){
|
||||||
|
js.ajaxSubmit("${ctx}/test/testData/transTest", function(data){
|
||||||
|
js.showMessage(data.message);
|
||||||
|
page();
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -22,7 +22,10 @@ import com.jeesite.modules.test.entity.TestDataChild;
|
|||||||
import com.jeesite.modules.test.service.TestDataService;
|
import com.jeesite.modules.test.service.TestDataService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 多数据源并发测试,将 TestDataChildDao 的数据源设置为 ds2
|
* 多数据源并发测试<br>
|
||||||
|
* 1、将 TestDataChildDao 的数据源设置为 ds2<br>
|
||||||
|
* 2、将 TestDataChild 的表名设置为 test_data_child2<br>
|
||||||
|
* 3、配置 ds2 数据源,并创建 test_data_child2 表
|
||||||
* @author ThinkGem
|
* @author ThinkGem
|
||||||
* @version 2019-6-26
|
* @version 2019-6-26
|
||||||
*/
|
*/
|
||||||
@@ -47,12 +50,12 @@ public class MultiDataSourceTest extends BaseSpringContextTests {
|
|||||||
new TestDataChild(), new TestDataChild(), new TestDataChild()));
|
new TestDataChild(), new TestDataChild(), new TestDataChild()));
|
||||||
testDataService.save(testData);
|
testDataService.save(testData);
|
||||||
List<TestData> list = testDataService.findList(new TestData());
|
List<TestData> list = testDataService.findList(new TestData());
|
||||||
System.out.println(list.size());
|
System.out.println("size: " + list.size());
|
||||||
list.forEach(e -> {
|
list.forEach(e -> {
|
||||||
System.out.println(testDataService.get(e));
|
System.out.println("get: " + testDataService.get(e));
|
||||||
});
|
});
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
System.err.println(e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
latch.countDown();
|
latch.countDown();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
package com.jeesite.test;
|
|
||||||
|
|
||||||
public class Test {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user