读写分离

yun-zuoyi
汪云昊 6 years ago
commit 3a083c00c7

@ -16,25 +16,25 @@ public interface ISystemInitService {
*
*/
@ApiOperation(value = "初始化加载所有数据",notes = "初始化加载所有数据")
void loadAll();
void putAndLoadAll();
/**
*
*/
@ApiOperation(value = "加载系统配置",notes = "加载系统配置")
void loadSysConfig();
void putAndLoadSysConfig();
/**
*
*/
@ApiOperation(value = "加载字典数据",notes = "加载字典数据")
void loadSysDictionary();
void putAndLoadSysDictionary();
/**
*
*/
@ApiOperation(value = "加载语言数据",notes = "加载语言数据")
void loadSysLocaleLanguage();
void putAndLoadSysLocaleLanguage();
/**
*

@ -6,6 +6,7 @@ import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.platform.bean.SysUser;
import io.swagger.annotations.ApiOperation;
import javax.transaction.Transactional;
import java.util.List;
/**
@ -34,4 +35,8 @@ public interface ITestService {
@ApiOperation(value = "查询用户")
List<SysUser> listSysUser();
@ApiOperation(value = "读写分离测试写")
@Transactional
void write();
}

@ -1,6 +1,11 @@
package cn.estsh.i3plus.core.api.iservice.busi;
import cn.estsh.i3plus.pojo.platform.bean.TestTransUser;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @Description :
@ -15,5 +20,106 @@ public interface ITestTransService {
void testListTran(int type,String name);
@ApiOperation(value = "自定义dao混用")
void testListTranSec(int type,String name);
void testTran();
/******************** 读写分离部分测试 **********************/
@ApiOperation(value = "读写分离测试读")
@Transactional
List<TestTransUser> listRead();
@ApiOperation(value = "读写分离测试写")
@Transactional
void write();
@ApiOperation(value = "读写分离测试读写-写事务")
void transReadWrite();
@ApiOperation(value = "读写分离测试读写-读事务")
void readWrite();
/******************** 事务机制部分demo **********************/
//@ApiOperation(value = "开始事务执行过程中休眠seconds秒")
//void readTransTest(int seconds);
//void testListTranSec(int type,String name);
@ApiOperation(value = "更新对象")
void updateTestTransUser(String name, double salary);
@ApiOperation(value = "新增对象")
void insertTestTransUser(String name,double salary);
/**
* type == 1
* type == 2 name
*/
@ApiOperation(value = "删除对象")
void deleteTestTransUser(String name);
@ApiOperation(value = "第一类丢失更新")
void updateLost(String name, int time, boolean execp);
@ApiOperation(value = "第二类丢失更新")
void updateLostTrans(String name,double salary, int time, boolean execp);
@ApiOperation(value = "脏读模拟A")
void writeDirtyA(long id);
@ApiOperation(value = "脏读模拟B")
void writeDirtyB(long id);
@ApiOperation(value = "不可重复读A")
void writeRepeatA(long id);
@ApiOperation(value = "不可重复读B")
void writeRepeatB(long id);
@ApiOperation(value = "幻读模拟A")
void writePhantomA(long id,boolean listOrDelete);
@ApiOperation(value = "幻读模拟B")
void writePhantomB();
@ApiOperation(value = "创建新事务")
void writeRequireNew();
@ApiOperation(value = "创建新事务-子方法")
void writeRequireNewMore();
@ApiOperation(value = "没有事务抛出异常")
void writeTransMandatory();
@ApiOperation(value = "没有事务抛出异常-子方法")
void writeTransMandatoryMore();
@ApiOperation(value = "乐观锁 Optimistic lockA")
void writeOptimisticA(long id,int type);
@ApiOperation(value = "乐观锁 Optimistic lockB")
void writeOptimisticB(long id,int type);
@ApiOperation(value = "悲观锁 pessimistic lockA")
void writePessimisticA(long id,int type);
@ApiOperation(value = "悲观锁 pessimistic lockB")
void writePessimisticB(long id,int type);
@ApiOperation(value = "常见事务处理-可能出现并发问题")
void writePatternWrong(long id,double salary);
@ApiOperation(value = "事务模式-线程锁")
void writePatternSynchron(long id,double salary);
@ApiOperation(value = "事务模式-乐观锁")
void writePatternOpti(long id,double salary);
@ApiOperation(value = "事务模式-悲观锁")
void writePatternPessi(long id,double salary);
@ApiOperation(value = "属性更新")
void writePatternParamUpdate(long id,double salary);
}

@ -42,7 +42,7 @@ public class AppStartSystemInit implements CommandLineRunner {
packIMPPResources();
LOGGER.info("【IMPP-Core开始加载基础信息...】");
systemInitService.loadAll();
systemInitService.putAndLoadAll();
}
/**

@ -1,18 +1,27 @@
package cn.estsh.i3plus.core.apiservice.controller;
import cn.estsh.i3plus.core.api.iservice.busi.ITestService;
import cn.estsh.i3plus.core.api.iservice.busi.ITestTransService;
import cn.estsh.i3plus.platform.common.util.PlatformConstWords;
import cn.estsh.i3plus.pojo.platform.bean.TestTransUser;
import cn.estsh.impp.framework.base.controller.CoreBaseController;
import cn.estsh.impp.framework.boot.datasource.DataSourceConfig;
import cn.estsh.impp.framework.boot.datasource.DynamicDataSourceHolder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.persistence.LockModeType;
import java.util.List;
/**
* @Description : entityManager
* @Reference :
@ -22,13 +31,16 @@ import org.springframework.web.bind.annotation.RestController;
**/
@RestController
@Api(description = "对事务以及entityManager的操作演示")
@RequestMapping(PlatformConstWords.BASE_URL + "/demo-trans")
@RequestMapping("/demo-trans")
public class DemoTransactionController extends CoreBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(DemoTransactionController.class);
@Autowired
private ITestTransService transService;
@Autowired
private ITestService testService;
/**
* dao
*
@ -45,17 +57,350 @@ public class DemoTransactionController extends CoreBaseController {
}
/**
* dao2
*
*
* @param type
* @param name
* @return
*/
@PostMapping("/test2")
@ApiOperation(value = "dao混合调用2")
public ResultBean transTest2(int type, String name) {
transService.testListTranSec(type, name);
@PostMapping("/test-dynamic-datasource")
@ApiOperation(value = "测试多数据源切换")
public ResultBean testDynamicDataSource(int type) {
//多服务调用
startMultiService();
if(type == 1){
System.out.println("====先查后插入====");
List<TestTransUser> uList = transService.listRead();
System.out.println("对象总数:" + uList.size());
System.out.println("开始插入");
transService.write();
uList = transService.listRead();
System.out.println("再次查询:" + uList.size());
}else if(type == 2){
System.out.println("====先插入后查====");
System.out.println("开始插入");
transService.write();
List<TestTransUser> uList = transService.listRead();
System.out.println("对象总数:" + uList.size());
if(uList.size() > 0){
throw new RuntimeException("111");
}
}else if(type == 3){
System.out.println("====先查后插入====");
List<TestTransUser> uList = transService.listRead();
System.out.println("对象总数:" + uList.size());
System.out.println("开始插入");
testService.write();
uList = transService.listRead();
System.out.println("再次查询:" + uList.size());
}
return ResultBean.success("测试成功");
}
/**
* Controller
*
* @return
*/
@PostMapping("/test-dynamic-datasource-more")
@ApiOperation(value = "测试多数据源切换")
public ResultBean testDynamicDataSourceWithController(boolean withMulti) {
if(withMulti) {
//多服务调用
startMultiService();
}
//读
readWriteTransactionTest(1);
//写
readWriteTransactionTest(2);
return ResultBean.success("测试成功");
}
/**
* -
* @return
*/
@PostMapping("/read-write-test")
@ApiOperation(value = "读写分离-事务测试")
public ResultBean readWriteTransactionTest(@RequestParam("testType") int testType) {
if(testType == 1) {
//读
List<TestTransUser> uList = transService.listRead();
System.out.println("对象总数:" + uList.size());
for (TestTransUser u : uList){
System.out.println(u);
}
}else if(testType == 2) {
//写
transService.write();
}else if(testType == 3) {
//读写(写事务)
transService.transReadWrite();
}else if(testType == 4) {
//读写(写事务)
transService.readWrite();
}
return ResultBean.success("测试成功");
}
/******************* 事务并发出现的问题*******************/
/**
*
* @param name name
* @param time
* @param execp
* @return
*/
@PostMapping("/update-lost")
@ApiOperation(value = "第一类丢失更新")
public ResultBean updateLost1(String name,int time,boolean execp) {
transService.updateLost(name,time,execp);
return ResultBean.success("幻读模拟结束");
}
/**
*
* @return
*/
@PostMapping("/update-lost-trans")
@ApiOperation(value = "第二类丢失更新")
public ResultBean updateLostTrans(String name,double salary,int time,boolean execp) {
transService.updateLostTrans(name,salary,time,execp);
return ResultBean.success("第二类丢失更新结束");
}
/**
*
* @return
*/
@PostMapping("/trans-dirty-a")
@ApiOperation(value = "脏读模拟A")
public ResultBean transDirtyA(long id) {
try{
transService.writeDirtyA(id);
}catch(Exception e){
System.out.println(e.getMessage());
}
return ResultBean.success("脏读模拟A结束");
}
/**
*
* @return
*/
@PostMapping("/trans-dirty-b")
@ApiOperation(value = "脏读模拟B")
public ResultBean transDirtyB(long id) {
transService.writeDirtyB(id);
return ResultBean.success("脏读模拟B结束");
}
/**
* A
* @return
*/
@PostMapping("/trans-repeat-a")
@ApiOperation(value = "不可重复读A")
public ResultBean transRepeatA(long id) {
transService.writeRepeatA(id);
return ResultBean.success("不可重复读A结束");
}
/**
* B
* @return
*/
@PostMapping("/trans-repeat-b")
@ApiOperation(value = "不可重复读B")
public ResultBean transRepeatB(long id) {
transService.writeRepeatB(id);
return ResultBean.success("不可重复读B结束");
}
/**
*
* @return
*/
@PostMapping("/trans-phantom-a")
@ApiOperation(value = "幻读模拟A")
public ResultBean transPhantomA(long id,boolean listOrDelete) {
try {
transService.writePhantomA(id, listOrDelete);
}catch(Exception e){
System.out.println("幻读异常:" + e.getMessage());
}
return ResultBean.success("幻读模拟A结束");
}
/**
*
* @return
*/
@PostMapping("/trans-phantom-b")
@ApiOperation(value = "幻读模拟B")
public ResultBean transPhantomB() {
transService.writePhantomB();
return ResultBean.success("幻读模拟B结束");
}
/********************* 事务传播 *******************/
/**
* -
* @return
*/
@PostMapping("/trans-require-new")
@ApiOperation(value = "创建新事务")
public ResultBean transRequireNew() {
transService.writeRequireNew();
return ResultBean.success("require-new结束");
}
/**
* -mandatory
* @return
*/
@PostMapping("/trans-mandatory")
@ApiOperation(value = "没有事务抛出异常")
public ResultBean transMandatory() {
transService.writeTransMandatory();
return ResultBean.success("mandatory结束");
}
/******************* 事务隔离级别 *******************/
//调用事务出现的问题,打开事务注释
/********************* 乐观锁 Optimistic lock *******************/
/**
* A
* @return
*/
@PostMapping("/trans-optimistic-a")
@ApiOperation(value = "乐观锁 Optimistic lockA")
public ResultBean transOptimisticA(long id,int type) {
transService.writeOptimisticA(id,type);
return ResultBean.success("乐观锁 Optimistic lockA结束");
}
/**
* B
* @return
*/
@PostMapping("/trans-optimistic-b")
@ApiOperation(value = "乐观锁 Optimistic lockB")
public ResultBean transOptimisticB(long id,int type) {
transService.writeOptimisticB(id,type);
return ResultBean.success("乐观锁 Optimistic lockB结束");
}
/********************* 悲观锁 Pessimistic Lock *******************/
/**
* A
* @return
*/
@PostMapping("/trans-pessimistic-a")
@ApiOperation(value = "悲观锁 pessimistic lockA")
public ResultBean transPessimisticA(long id,int type) {
transService.writePessimisticA(id,type);
return ResultBean.success("悲观锁 pessimistic lockA结束");
}
/**
* B
* @return
*/
@PostMapping("/trans-pessimistic-b")
@ApiOperation(value = "悲观锁 pessimistic lockB")
public ResultBean transPessimisticB(long id,int type) {
transService.writePessimisticB(id,type);
return ResultBean.success("悲观锁 pessimistic lockB结束");
}
/********************* 事务设计 *******************/
/**
*
* @return
*/
@PostMapping("/trans-pattern-wrong")
@ApiOperation(value = "常见事务处理(可能出现并发问题)")
public ResultBean transPatternWrong(long id,double salary) {
transService.writePatternWrong(id,salary);
return ResultBean.success("常见事务处理");
}
/**
* 线
* @return
*/
@PostMapping("/trans-pattern-synchronized")
@ApiOperation(value = "事务模式-线程锁")
public ResultBean transPatternSynchron(long id,double salary) {
transService.writePatternSynchron(id,salary);
return ResultBean.success("事务模式-线程锁");
}
/**
*
* @return
*/
@PostMapping("/trans-pattern-opti")
@ApiOperation(value = "事务模式-乐观锁")
public ResultBean transPatternOpti(long id,double salary) {
transService.writePatternOpti(id,salary);
return ResultBean.success("事务模式-乐观锁");
}
/**
*
* @return
*/
@PostMapping("/trans-pattern-pessi")
@ApiOperation(value = "事务模式-悲观锁")
public ResultBean transPatternPessi(long id,double salary) {
transService.writePatternPessi(id,salary);
return ResultBean.success("事务模式-悲观锁");
}
/**
*
* @return
*/
@PostMapping("/trans-pattern-param-update")
@ApiOperation(value = "事务模式-属性更新")
public ResultBean transPatternParamUpdate(long id,double salary) {
transService.writePatternParamUpdate(id,salary);
return ResultBean.success("事务模式-属性更新");
}
}

@ -50,6 +50,8 @@ public class BaseMessageController extends CoreBaseController {
*/
public ResultBean basaeInsertSysMessage(SysMessage sysMessage) {
try {
startMultiService();
// 条件校验
ValidatorBean.beginValid(sysMessage)
.notNull("messageTitle", sysMessage.getMessageTitle())

@ -10,6 +10,7 @@ import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.bean.BaseConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.model.platform.UserDetailModel;
import cn.estsh.i3plus.pojo.platform.bean.*;
import cn.estsh.impp.framework.base.controller.CoreBaseController;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -110,6 +112,8 @@ public class WhiteController extends CoreBaseController {
@ApiOperation(value="登陆",notes="登陆")
public ResultBean login(HttpServletRequest request, String loginName, String loginPwd, String languageCode,
@RequestParam(required = false) String ipAddr){
startMultiService();
LOGGER.info("用户登陆 loginName:{} loginPwd:{} languageCode:{}",loginName,loginPwd,languageCode);
ResultBean result = null;
try {
@ -207,6 +211,8 @@ public class WhiteController extends CoreBaseController {
@ApiOperation(value = "根据语言代码查询资源")
public ResultBean findSysLocaleResourceByLanguageCode(String languageCode){
try {
startMultiService();
ValidatorBean.checkNotNull(languageCode,"语言代码不能为空");
if (sysLocaleLanguageService.getSysLocaleLanguageByCode(languageCode) == null) {
throw ImppExceptionBuilder.newInstance()
@ -219,7 +225,7 @@ public class WhiteController extends CoreBaseController {
// 从缓存获取语言信息
Map<Object, Object> resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + languageCode);
if (resourceMap == null || resourceMap.size() == 0) {
systemInitService.loadSysLocaleLanguage();
systemInitService.putAndLoadSysLocaleLanguage();
resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + languageCode);
}
@ -235,6 +241,8 @@ public class WhiteController extends CoreBaseController {
@ApiOperation(value = "新增文件资源", notes = "新增文件资源")
public ResultBean insertSysFile(@RequestBody SysFile sysFile){
try {
startMultiService();
// 条件验证
ValidatorBean.beginValid(sysFile)
.notNull("dfsFileName", sysFile.getDfsFileName())
@ -303,4 +311,17 @@ public class WhiteController extends CoreBaseController {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping(value = "/sys-find-user/list")
@ApiOperation(value = "查询用户列表信息",notes = "查询用户列表信息")
public ResultBean findSysUserInfoList(UserDetailModel model){
try {
List<SysUser> userList = personnelService.querySysUserByUserDetailModelOrIds(model, new ArrayList<>());
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(userList);
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);
}catch(Exception e){
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -64,6 +64,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "添加用户信息", notes = "返回内容添加用户信息")
public ResultBean insertUserDetailModel(UserDetailModel model) {
try {
startMultiService();
SysUser user = model.getSysUser();
SysUserInfo info = model.getSysUserInfo();
@ -143,6 +145,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "修改用户信息", notes = "返回内容添加用户信息")
public ResultBean updateUserDetailModel(UserDetailModel model) {
try {
startMultiService();
SysUser user = model.getSysUser();
SysUserInfo info = model.getSysUserInfo();
@ -228,6 +232,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "修改用户信息", notes = "返回内容添加用户信息")
public ResultBean updateUserModel(UserDetailModel model) {
try {
startMultiService();
checkUserModel(model);
SysUser user = personnelService.getSysUserById(Long.parseLong(model.getUserId()));
initUser(model, user);
@ -334,6 +340,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "删除用户信息", notes = "根据用户信息id删除信息")
public ResultBean deleteSysUserInfo(@PathVariable("id") String id) {
try {
startMultiService();
//条件验证
ValidatorBean.checkNotNull(id, "id为空");
@ -362,6 +370,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "根据id批量删除", notes = "根据id批量删除")
public ResultBean deleteSysUserInfoByIds(String[] ids) {
try {
startMultiService();
ids = ConvertBean.modelSafeArrayNumber(ids, true);
if (ids.length == 0) {
throw ImppExceptionBuilder.newInstance()
@ -405,6 +415,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "删除账号信息", notes = "根据账号信息id删除信息")
public ResultBean deleteSysUser(@PathVariable("id") String id) {
try {
startMultiService();
//条件验证
ValidatorBean.checkNotNull(id, "id为空");
@ -433,6 +445,8 @@ public class PersonnelController extends CoreBaseController {
@ApiOperation(value = "根据id批量删除", notes = "根据id批量删除")
public ResultBean deleteSysUserByIds(String[] ids) {
try {
startMultiService();
ids = ConvertBean.modelSafeArrayNumber(ids, true);
if (ids.length == 0) {
throw ImppExceptionBuilder.newInstance()
@ -631,6 +645,8 @@ public class PersonnelController extends CoreBaseController {
* @param model
*/
public void refreshRef(SysUser user, SysUserInfo info, UserDetailModel model) {
startMultiService();
if (user != null) {
// 刷新账号 部门关系
personnelService.refreshRefSysUserDepartment(user.getId(), StringTool.getArrayLong(model.getUserDepartmentIdList()));

@ -97,6 +97,8 @@ public class SysBarcodeRuleController extends CoreBaseController {
@ApiOperation(value = "删除条码规则",notes = "删除条码规则")
public ResultBean deleteSysBarcodeRuleById(@PathVariable("id") String idStr) {
try {
startMultiService();
// 条件验证
ValidatorBean.checkNotNull(idStr,"id不能为空");
SysBarcodeRule sysBarcodeRule = sysBarcodeRuleService.getSysBarcodeRuleById(Long.parseLong(idStr));

@ -75,7 +75,7 @@ public class SysConfigController extends CoreBaseController {
ConvertBean.modelInitialize(sysConfig,user);
sysConfigService.insertSysConfig(sysConfig);
systemInitService.loadSysConfig();
systemInitService.putAndLoadSysConfig();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);
@ -93,6 +93,8 @@ public class SysConfigController extends CoreBaseController {
@ApiOperation(value = "根据id删除系统参数", notes = "根据id删除系统参数")
public ResultBean deleteSysConfig(@PathVariable("id") String idStr) {
try {
startMultiService();
// 条件验证
ValidatorBean.checkNotNull(idStr,"id不能为空");
if(sysConfigService.getSysConfigById(Long.parseLong(idStr)) == null){
@ -105,7 +107,7 @@ public class SysConfigController extends CoreBaseController {
}
sysConfigService.deleteSysConfigById(Long.parseLong(idStr));
systemInitService.loadSysConfig();
systemInitService.putAndLoadSysConfig();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);
@ -137,7 +139,7 @@ public class SysConfigController extends CoreBaseController {
ConvertBean.modelUpdate(sysConfig,user);
sysConfigService.updateSysConfig(sysConfig);
systemInitService.loadSysConfig();
systemInitService.putAndLoadSysConfig();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);
@ -268,7 +270,7 @@ public class SysConfigController extends CoreBaseController {
ValidatorBean.checkNotNull(value,"值不能为空");
sysConfigService.updateSysConfigByCode(code,value);
systemInitService.loadSysConfig();
systemInitService.putAndLoadSysConfig();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);

@ -115,6 +115,8 @@ public class SysDictionaryController extends CoreBaseController{
@ApiOperation(value = "根据id删除字典",notes = "根据id删除字典")
public ResultBean updateSysDictionary(@PathVariable("id") String idStr) {
try {
startMultiService();
// 条件验证
ValidatorBean.checkNotNull(idStr,"id不能为空");
SysDictionary sysDictionary = sysDictionaryService.getSysDictionaryById(Long.parseLong(idStr));

@ -87,6 +87,8 @@ public class SysFileController extends CoreBaseController{
@ApiOperation(value = "根据id删除文件资源", notes = "根据id删除文件资源")
public ResultBean deleteSysFileById(@PathVariable("id") String idStr){
try {
startMultiService();
ValidatorBean.checkNotNull(idStr, "id不能为空");
SysFile sysFile = sysFileService.getSysFileById(Long.parseLong(idStr));
ValidatorBean.checkNotNull(sysFile, "文件信息不存在");
@ -201,6 +203,8 @@ public class SysFileController extends CoreBaseController{
@ApiOperation(value = "文件上传", notes = "文件上传")
public ResultBean singleFileUpload(@RequestParam("file") MultipartFile file) {
try {
startMultiService();
if(file.isEmpty()){
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
@ -239,6 +243,8 @@ public class SysFileController extends CoreBaseController{
@ApiOperation(value = "文件下载", notes = "文件下载")
public ResultBean singleDownload(@PathVariable("id")String id, HttpServletResponse response) {
try {
startMultiService();
ValidatorBean.checkIsNumber(id, "文件ID不能为空");
SysFile sysFile = sysFileService.getSysFileById(Long.parseLong(id));
@ -306,6 +312,8 @@ public class SysFileController extends CoreBaseController{
@ApiOperation(value = "新增文件资源", notes = "新增文件资源")
public ResultBean insertSysFile(@RequestBody SysFile sysFile){
try {
startMultiService();
// 条件验证
ValidatorBean.beginValid(sysFile)
.notNull("dfsFileName", sysFile.getDfsFileName())

@ -81,6 +81,8 @@ public class SysLabelTemplateController extends CoreBaseController {
@ApiOperation(value = "根据id删除打印模板", notes = "根据id删除打印模板")
public ResultBean deleteSysLabelTemplate(@PathVariable("id") String idStr) {
try {
startMultiService();
// 条件验证
ValidatorBean.checkNotNull(idStr,"id不能为空");
if(sysLabelTemplateService.getSysLabelTemplateById(Long.parseLong(idStr)) == null){

@ -92,7 +92,7 @@ public class SysLocaleLanguageController extends CoreBaseController {
sysLocaleLanguageService.updateSysLocaleLanguage(sysLocaleLanguage);
// 重新加载资源
systemInitService.loadSysLocaleLanguage();
systemInitService.putAndLoadSysLocaleLanguage();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);
@ -110,6 +110,8 @@ public class SysLocaleLanguageController extends CoreBaseController {
@ApiOperation(value = "根据id删除系统语言",notes = "根据id删除系统语言")
public ResultBean deleteSysLocaleLanguageById(@PathVariable("id") String idStr){
try {
startMultiService();
//条件验证
ValidatorBean.checkNotNull(idStr,"id不能为空");
SysLocaleLanguage sysLocaleLanguage =sysLocaleLanguageService.getSysLocaleLanguageById(Long.parseLong(idStr));
@ -210,7 +212,7 @@ public class SysLocaleLanguageController extends CoreBaseController {
sysLocaleLanguageService.deleteSysLocaleLanguageByIds(StringTool.getArrayLong(idsStr));
// 重新加载语言资源
systemInitService.loadSysLocaleLanguage();
systemInitService.putAndLoadSysLocaleLanguage();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);

@ -120,6 +120,8 @@ public class SysLocaleResourceController extends CoreBaseController {
@ApiOperation(value = "根据id删除系统语言资源",notes = "根据id删除系统语言资源")
public ResultBean deleteSysLocaleResourceById(@PathVariable("id") String idStr){
try {
startMultiService();
//条件验证
ValidatorBean.checkNotNull(idStr,"id不能为空");
SysLocaleResource sysLocaleResource =sysLocaleResourceService.getSysLocaleResourceById(Long.parseLong(idStr));
@ -198,7 +200,7 @@ public class SysLocaleResourceController extends CoreBaseController {
sysLocaleResourceService.deleteSysLocaleResourceByIds(StringTool.getArrayLong(idsStr));
// 重新加载资源
systemInitService.loadSysLocaleLanguage();
systemInitService.putAndLoadSysLocaleLanguage();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);
@ -227,7 +229,7 @@ public class SysLocaleResourceController extends CoreBaseController {
sysLocaleResourceService.insertSysLocaleResourceList(sysLocaleResourcesList);
// 重新加载资源
systemInitService.loadSysLocaleLanguage();
systemInitService.putAndLoadSysLocaleLanguage();
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
}catch(ImppBusiException busExcep){
return ResultBean.fail(busExcep);

@ -103,6 +103,8 @@ public class SysLogExceptionController extends CoreBaseController {
@GetMapping(value = "/export")
@ApiOperation(value = "导出系统异常日志")
public ResultBean exportSysLogException(SysLogException sysLogException, String[] colName, int pageSize,boolean isZip) {
startMultiService();
ListPager listPager;
List result = new ArrayList();
File zipFile = null;

@ -190,6 +190,8 @@ public class SysLogOperateController extends CoreBaseController {
File excelDir = null;
File excelFile;
try {
startMultiService();
Pager pager = new Pager();
pager.setCurrentPage(1);
// 判断是否超过excel最大导出数量设定值

@ -178,6 +178,8 @@ public class SysLogSystemController extends CoreBaseController{
File excelDir = null;
File excelFile;
try {
startMultiService();
Pager pager = new Pager();
pager.setCurrentPage(1);
// 判断是否超过excel最大导出数量设定值

@ -311,6 +311,8 @@ public class SysOrderNoRuleController extends CoreBaseController {
@ApiOperation(value = "下载导入模板")
public ResultBean downSysOrderNoRuleTemplate() {
try {
startMultiService();
FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + "ImportTemplate.xls",
ExcelUtil.importTemplate(SysOrderNoRule.class), "xls");

@ -52,6 +52,8 @@ public class SysRoleController extends CoreBaseController{
@ApiOperation(value = "新增系统角色", notes = "系统角色")
public ResultBean insertSysRole(SysRole role) {
try {
startMultiService();
//条件验证
ValidatorBean.beginValid(role)
.notNull("name", role.getName());
@ -82,6 +84,8 @@ public class SysRoleController extends CoreBaseController{
@ApiOperation(value = "修改系统角色", notes = "系统角色")
public ResultBean updateSysRole(SysRole role) {
try {
startMultiService();
// 数据校验
ValidatorBean.beginValid(role)
.notNull("id", role.getId())
@ -283,6 +287,8 @@ public class SysRoleController extends CoreBaseController{
@ApiOperation(value = "新增角色权限关系", notes = "新增角色权限关系")
public ResultBean insertRefMenu(String roleId,String[] refIds) {
try {
startMultiService();
// 数据校验
ValidatorBean.checkNotNull(roleId, "角色roleId 不能为空");
@ -308,6 +314,8 @@ public class SysRoleController extends CoreBaseController{
@ApiOperation(value = "批量新增角色权限关系", notes = "批量新增角色权限关系")
public ResultBean insertBatchRefMenu(String[] roleIds,String[] menuIds) {
try {
startMultiService();
roleIds = ConvertBean.modelSafeArrayNumber(roleIds,true);
menuIds = ConvertBean.modelSafeArrayNumber(menuIds,true);

@ -158,6 +158,8 @@ public class SysTaskController extends CoreBaseController {
@ApiOperation(value = "删除任务", notes = "删除任务")
public ResultBean deleteSysTaskById(@PathVariable("id") String idStr) {
try {
startMultiService();
// 数据校验
ValidatorBean.checkNotNull(idStr, "id不能为空");
if (sysTaskService.getSysTaskById(Long.parseLong(idStr)) == null) {

@ -165,6 +165,8 @@ public class SysTaskCycleController extends CoreBaseController {
@ApiOperation(value = "删除任务周期", notes = "删除任务周期")
public ResultBean deleteSysTaskCycle(@PathVariable("id") String idStr) {
try {
startMultiService();
// 数据校验
ValidatorBean.checkNotNull(idStr, "时间表达式id 不能为空");
if (sysTaskCycleService.getSysTaskCycleById(Long.parseLong(idStr)) == null) {

@ -114,6 +114,8 @@ public class SysTaskPlanController extends CoreBaseController {
@ApiOperation(value = "新增任务计划", notes = "任务计划")
public ResultBean insertSysTaskTime(SysTaskPlan sysTaskPlan, Integer isExecute) {
try {
startMultiService();
// 数据校验
ValidatorBean.beginValid(sysTaskPlan)
.notNull("name", sysTaskPlan.getName())
@ -195,6 +197,8 @@ public class SysTaskPlanController extends CoreBaseController {
@ApiOperation(value = "修改任务计划", notes = "任务计划")
public ResultBean updateSysTaskTime(SysTaskPlan sysTaskPlan, Integer isExecute) {
try {
startMultiService();
ResultBean resultBean = ResultBean.success("操作成功")
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode())
.setResultObject(sysTaskPlan);
@ -270,6 +274,8 @@ public class SysTaskPlanController extends CoreBaseController {
@ApiOperation(value = "删除任务计划", notes = "删除任务计划")
public ResultBean deleteSysTaskTime(@PathVariable("id") String id) {
try {
startMultiService();
// 数据校验
ValidatorBean.checkNotNull(id, "任务计划id 不能为空");
SysTaskPlan sysTaskPlan = sysTaskPlanService.getSysTaskPlanById(Long.parseLong(id));
@ -339,6 +345,8 @@ public class SysTaskPlanController extends CoreBaseController {
@ApiOperation(value = "修改任务计划状态", notes = "根据ID修改任务计划状态")
public ResultBean updateQuartzStatus(@PathVariable("id") String idStr, @PathVariable("status") Integer status) {
try {
startMultiService();
// 数据校验
ValidatorBean.checkNotNull(idStr, "id 不能为空");
ValidatorBean.checkNotZero(status, "状态不能为空");

@ -102,6 +102,8 @@ public class SysToolTypeController extends CoreBaseController{
@ApiOperation(value = "根据id删除硬件类型",notes = "根据id删除硬件类型")
public ResultBean deleteSysToolType(@PathVariable("id") String idStr){
try {
startMultiService();
ValidatorBean.checkNotNull(idStr,"id不能为空");
if(toolTypeService.getSysToolTypeById(Long.parseLong(idStr)) == null){
throw ImppExceptionBuilder.newInstance()

@ -72,6 +72,8 @@ public class SysUserController extends CoreBaseController{
@ApiOperation(value = "新增用户", notes = "新增系统用户")
public ResultBean insertSysUser(SysUser sysUser,String[] roleIds) {
try {
startMultiService();
ConvertBean.modelSafeArrayNumber(roleIds,true);
ValidatorBean.beginValid(sysUser)
@ -133,6 +135,8 @@ public class SysUserController extends CoreBaseController{
@ApiOperation(value = "修改用户", notes = "修改用户信息")
public ResultBean updateSysUser(SysUser sysUser,String[] roleIds) {
try {
startMultiService();
ConvertBean.modelSafeArrayNumber(roleIds,true);
ValidatorBean.beginValid(sysUser)
.numberCheck("id",sysUser.getUserInfoId())
@ -248,6 +252,8 @@ public class SysUserController extends CoreBaseController{
@ApiOperation(value = "修改密码", notes = "修改当前登录用户密码")
public ResultBean updateSysUserPassword(String password,String newPwd) {
try {
startMultiService();
SessionUser sessionUser = AuthUtil.getSessionUser();
// 数据校验
ValidatorBean.checkNotNull(password, "旧密码不能为空");
@ -382,6 +388,8 @@ public class SysUserController extends CoreBaseController{
@ApiOperation(value = "密码重置",notes = "根据id重置用户密码")
public ResultBean updateResetPassword(@PathVariable String id){
try {
startMultiService();
SysUser user = sysUserService.getSysUserById(Long.parseLong(id));
if(user != null){
Integer num = personnelService.checkSysUserResetPassword(user);
@ -531,6 +539,8 @@ public class SysUserController extends CoreBaseController{
@ApiOperation(value = "修改用户操作组织id")
public ResultBean updateSysUserOrganize(String idStr, String organizeIdStr){
try{
startMultiService();
ValidatorBean.checkNotNull(idStr, "id不能为空");
SysUser sysUser = sysUserService.getSysUserById(Long.parseLong(idStr));
ValidatorBean.checkNotNull(sysUser, "用户不存在");

@ -71,6 +71,8 @@ public class SysUserInfoController extends CoreBaseController{
@ApiOperation(value="添加用户信息",notes="返回内容添加用户信息")
public ResultBean insertSysUserInfo(SysUserInfo userInfo){
try {
startMultiService();
//登陆用户
SessionUser user = AuthUtil.getSessionUser();
@ -103,6 +105,8 @@ public class SysUserInfoController extends CoreBaseController{
@ApiOperation(value="修改用户信息",notes="根据用户信息id修改信息")
public ResultBean updateSysUserInfoById(SysUserInfo userInfo){
try {
startMultiService();
//登陆用户
SessionUser user = AuthUtil.getSessionUser();

@ -51,16 +51,16 @@ public class SystemInitService implements ISystemInitService {
@Override
@ApiOperation(value = "初始化加载所有数据",notes = "初始化加载所有数据")
public void loadAll() {
public void putAndLoadAll() {
type = ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue();
loadSysConfig();
loadSysDictionary();
loadSysLocaleLanguage();
putAndLoadSysConfig();
putAndLoadSysDictionary();
putAndLoadSysLocaleLanguage();
}
@Override
@ApiOperation(value = "加载系统配置",notes = "加载系统配置")
public void loadSysConfig() {
public void putAndLoadSysConfig() {
String redisKey = null;
List<SysConfig> list = configRDao.findAll();
for (SysConfig config : list) {
@ -74,7 +74,7 @@ public class SystemInitService implements ISystemInitService {
@Override
@ApiOperation(value = "加载字典数据",notes = "加载字典数据")
public void loadSysDictionary() {
public void putAndLoadSysDictionary() {
try {
List<SysDictionary> list = dictionaryRDao.findAll();
if(list != null && list.size() > 0){
@ -99,7 +99,7 @@ public class SystemInitService implements ISystemInitService {
@Override
@ApiOperation(value = "加载语言数据",notes = "加载语言数据")
public void loadSysLocaleLanguage() {
public void putAndLoadSysLocaleLanguage() {
// Redis 缓存
if(type == ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue()){
/**

@ -13,7 +13,9 @@ import cn.estsh.i3plus.pojo.base.tool.HqlPack;
import cn.estsh.i3plus.pojo.platform.bean.SysDepartment;
import cn.estsh.i3plus.pojo.platform.bean.SysOrganize;
import cn.estsh.i3plus.pojo.platform.bean.SysUser;
import cn.estsh.i3plus.pojo.platform.bean.TestTransUser;
import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository;
import cn.estsh.i3plus.pojo.platform.repository.TestTransUserRepository;
import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
@ -24,6 +26,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @Description :
@ -43,6 +46,9 @@ public class TestService implements ITestService {
@Autowired
private SysUserRepository sysUserRDao;
@Autowired
private TestTransUserRepository testTransUserRepository;
@Override
@ApiOperation(value = "多表查询")
public List<Object> queryToolAndToolType(Pager pager) {
@ -89,6 +95,18 @@ public class TestService implements ITestService {
}
@Override
public void write() {
Random ran = new Random(10000);
TestTransUser u = new TestTransUser();
u.setName("na2me" + ran.nextInt(100));
u.setSalary(ran.nextDouble());
System.out.println("插入对象:" + u);
u = testTransUserRepository.insert(u);
System.out.println("插入对象:" + u);
}
@Override
public void insertSysUser(SysUser sysUser) {
sysUserRDao.insert(sysUser);
}

@ -3,18 +3,22 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.core.api.iservice.busi.ITestTransService;
import cn.estsh.i3plus.core.apiservice.dao.ITestTransDao;
import cn.estsh.i3plus.core.apiservice.dao.ITransDaoSec;
import cn.estsh.i3plus.pojo.platform.bean.SysDepartment;
import cn.estsh.i3plus.pojo.platform.bean.SysTool;
import cn.estsh.i3plus.pojo.platform.bean.SysUser;
import cn.estsh.i3plus.pojo.platform.bean.SysUserInfo;
import cn.estsh.i3plus.pojo.platform.bean.*;
import cn.estsh.i3plus.pojo.platform.repository.SysDepartmentRepository;
import cn.estsh.i3plus.pojo.platform.repository.SysUserInfoRepository;
import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository;
import com.netflix.discovery.converters.Auto;
import cn.estsh.i3plus.pojo.platform.repository.TestTransUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.LockModeType;
import java.util.List;
import java.util.Random;
/**
* @Description :
@ -41,6 +45,9 @@ public class TestTransService implements ITestTransService {
@Autowired
private ITransDaoSec testTransSecDao;
@Autowired
private TestTransUserRepository testTransUserRepository;
@Override
public void testListTran(int type,String name) {
if(type == 1) {
@ -130,8 +137,380 @@ public class TestTransService implements ITestTransService {
}
}
@Transactional(propagation=Propagation.NESTED,isolation=Isolation.DEFAULT,readOnly = false,rollbackFor = Exception.class)
@Lock(value = LockModeType.PESSIMISTIC_WRITE)
@Override
public void testTran() {
}
@Override
public List<TestTransUser> listRead() {
List<TestTransUser> ul = testTransUserRepository.list();
testTransUserRepository.flush();
System.out.println("查询333数量" + ul);
return ul;
}
@Override
public void write() {
Random ran = new Random(10000);
TestTransUser u = new TestTransUser();
u.setName("na2me" + ran.nextInt(100));
u.setSalary(ran.nextDouble());
System.out.println("插入对象:" + u);
u = testTransUserRepository.insert(u);
System.out.println("插入对象:" + u);
}
@Override
public void transReadWrite() {
System.out.println("===写事务:查询后插入===");
listRead();
write();
}
@Override
public void readWrite() {
System.out.println("===读事务:查询后插入===");
listRead();
write();
}
@Override
public void updateTestTransUser(String name, double salary) {
TestTransUser u = testTransUserRepository.getByProperty("name",name);
u.setSalary(salary);
testTransUserRepository.update(u);
}
@Override
public void insertTestTransUser(String name, double salary) {
TestTransUser u = new TestTransUser();
u.setName(name);
u.setSalary(salary);
u = testTransUserRepository.insert(u);
System.out.println("插入对象:" + u);
}
@Override
public void deleteTestTransUser(String name) {
testTransUserRepository.deleteByProperty("name",name);
}
@Override
@Transactional(propagation = Propagation.NEVER) //没有事务
public void updateLost(String name, int time, boolean execp) {
TestTransUser u = testTransUserRepository.getByProperty("name",name);
u.setSalary(u.getSalary() + 100);
testTransUserRepository.update(u);
if(time > 0){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(execp){
throw new RuntimeException("手动异常");
}
}
@Override
@Transactional(propagation = Propagation.REQUIRED) //默认事务
public void updateLostTrans(String name,double salary, int time, boolean execp) {
TestTransUser u = testTransUserRepository.getByProperty("name",name);
u.setSalary(salary);
testTransUserRepository.update(u);
if(time > 0){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(execp){
throw new RuntimeException("手动异常");
}
}
@Override
public void writeDirtyA(long id) {
TestTransUser u = testTransUserRepository.getById(id);
System.out.println("脏读开始,对象值:" + u.getSalary());
u.setSalary(u.getSalary() + 666);
testTransUserRepository.update(u);
System.out.println("脏读数据已更新:" + u.getSalary());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(u.getSalary() > 0){
throw new RuntimeException("手动抛出,数据回滚。");
}
}
@Override
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
public void writeDirtyB(long id) {
TestTransUser u = testTransUserRepository.getById(id);
System.out.println("第一次查询:" + u);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
u = testTransUserRepository.getById(id);
System.out.println("第二次查询:" + u);
}
@Override
public void writeRepeatA(long id) {
TestTransUser u = testTransUserRepository.getById(id);
System.out.println("不可重复读开始,对象值:" + u.getSalary());
u.setSalary(u.getSalary() + 666);
testTransUserRepository.update(u);
System.out.println("不可重复读数据已更新:" + u.getSalary());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("不可重复读已提交数据!");
}
@Override
public void writeRepeatB(long id) {
TestTransUser u = testTransUserRepository.getById(id);
System.out.println("第一次查询:" + u);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
u = testTransUserRepository.getById(id);
System.out.println("第二次查询:" + u);
}
@Override
//@Transactional(isolation = Isolation.SERIALIZABLE)
public void writePhantomA(long id,boolean listOrDelete) {
int count = testTransUserRepository.listCount();
System.out.println("幻读开始,记录数量:" + count);
if(listOrDelete){
TestTransUser u = new TestTransUser();
u.setName("testPhantom");
u.setSalary(500d);
u = testTransUserRepository.insert(u);
System.out.println("插入对象:" + u);
u.setSalary(u.getSalary() * 10);
testTransUserRepository.update(u);
testTransUserRepository.flush();
System.out.println("update对象" + u);
}else{
testTransUserRepository.deleteById(id);
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(count > 0){
throw new RuntimeException("幻读抛出异常");
}
count = testTransUserRepository.listCount();
System.out.println("幻读结束,记录数量:" + count);
}
@Override
public void testListTranSec(int type,String name) {
@Transactional(isolation = Isolation.SERIALIZABLE)
public void writePhantomB() {
int count = testTransUserRepository.listCount();
System.out.println("幻读另一个事务开始,记录数量:" + count);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = testTransUserRepository.listCount();
System.out.println("幻读另一个事务结束,记录数量:" + count);
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void writeRequireNew() {
int count = testTransUserRepository.listCount();
System.out.println("插入前数量:" + count);
insertTestTransUser("require new",100);
count = testTransUserRepository.listCount();
System.out.println("插入后数量:" + count);
TestTransUser u = testTransUserRepository.getByProperty("name","require new");
System.out.println("查询对象:" + u);
writeRequireNewMore();
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void writeRequireNewMore() {
int count = testTransUserRepository.listCount();
System.out.println("【子事务】查询数量:" + count);
TestTransUser u = testTransUserRepository.getByProperty("name","require new");
System.out.println("【子事务】查询对象:" + u);
}
@Override
@Transactional(propagation = Propagation.NEVER)
public void writeTransMandatory() {
int count = testTransUserRepository.listCount();
System.out.println("数量:" + count);
writeTransMandatoryMore();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void writeTransMandatoryMore() {
int count = testTransUserRepository.listCount();
System.out.println("【子事务】查询数量:" + count);
}
@Override
//@Transactional(isolation=Isolation.REPEATABLE_READ)
//@Lock(value = LockModeType.WRITE)
public void writeOptimisticA(long id,int type) {
if(type == 1){
//脏读
writeDirtyA(id);
}else if(type == 2){
writeRepeatA(id);
}else if(type == 3){
writePhantomA(id,true);
}
}
@Override
public void writeOptimisticB(long id,int type) {
if(type == 1){
//脏读
writeDirtyB(id);
}else if(type == 2){
writeRepeatB(id);
}else if(type == 3){
writePhantomB();
}
}
@Override
//@Transactional(isolation=Isolation.REPEATABLE_READ)
//@Lock(value = LockModeType.PESSIMISTIC_WRITE)
public void writePessimisticA(long id,int type) {
if(type == 1){
//脏读
writeDirtyA(id);
}else if(type == 2){
writeRepeatA(id);
}else if(type == 3){
writePhantomA(id,true);
}
}
@Override
public void writePessimisticB(long id,int type) {
if(type == 1){
//脏读
writeDirtyB(id);
}else if(type == 2){
writeRepeatB(id);
}else if(type == 3){
writePhantomB();
}
}
@Override
public void writePatternWrong(long id,double salary) {
System.out.println("==事务并发问题==");
TestTransUser u = testTransUserRepository.getById(id);
System.out.println("更新前:" + u.getName() + "," + u.getSalary());
u.setSalary(salary);
System.out.println("更新后:" + u.getName() + "," + u.getSalary());
testTransUserRepository.update(u);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public synchronized void writePatternSynchron(long id,double salary) {
System.out.println("==添加线程锁==");
writePatternWrong(id,salary);
}
@Override
public void writePatternOpti(long id,double salary) {
System.out.println("==乐观锁==");
try {
writePatternWrong(id, salary);
}catch(Exception e){
System.out.println("在此处进行再次处理");
System.out.println("乐观锁抛出异常:" + e.getMessage());
}
}
@Override
public void writePatternPessi(long id,double salary) {
writePatternWrong(id, salary);
}
@Override
public void writePatternParamUpdate(long id,double salary) {
System.out.println("==通过更新属性值保证事务==");
TestTransUser u = testTransUserRepository.getById(id);
System.out.println("更新前:" + u.getName() + "," + u.getSalary());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//update TestTransUser set salary = salary + :salary where name=:name;
testTransUserRepository.updateByPropertiesWithVal("id",id,"salary",salary);
System.out.println("5秒后更新" + u.getName() + "," + u.getSalary());
}
}

@ -100,6 +100,13 @@
<artifactId>i3plus-platform-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>i3plus.platform</groupId>
<artifactId>i3plus-platform-plugin</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>i3plus.pojo</groupId>
<artifactId>i3plus-pojo-platform</artifactId>

Loading…
Cancel
Save