多线程 mysql 事务_多线程事务控制

packagecom.test.impl;importcom.test.entity.User2;importcom.test.entity.User3;importcom.test.mapper.User2Mapper;importcom.test.mapper.User3Mapper;importcom.test.service.TestBService;importcom.test.service.TestService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.PlatformTransactionManager;importorg.springframework.transaction.TransactionDefinition;importorg.springframework.transaction.TransactionStatus;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;importorg.springframework.transaction.interceptor.TransactionAspectSupport;importorg.springframework.transaction.support.DefaultTransactionDefinition;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;/*** Created by liuyachao on 2018/9/3.*/@Slf4j

@Servicepublic class TestServiceImpl implementsTestService {

@AutowiredprivateUser2Mapper user2Mapper;

@AutowiredprivateUser3Mapper user3Mapper;

@AutowiredprivateTestBService testBService;

@AutowiredprivatePlatformTransactionManager transactionManager;

List transactionStatuses = Collections.synchronizedList(new ArrayList());int count = 112;static int countTest = 0;

@Override

@Transactional(propagation= Propagation.REQUIRED, rollbackFor = {Exception.class})public intsaveUser2(User2 user2) {

Integer result= 0;try{

result=user2Mapper.insertSelective(user2);//int i = 1/0;

if(user2.getId() == 114){int i = 1/0;

}

}catch(Exception e){

log.error("插入异常",e);

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();returnresult;

}returnresult;

}

@OverridepublicUser3 getUser3List(User3 user3) {

User3 result=user3Mapper.selectByPrimaryKey(user3.getId());returnresult;

}

@Override

@Transactional(propagation= Propagation.REQUIRED, rollbackFor = {Exception.class})public voidthreadMethod(){

User2 user1= newUser2();

user1.setId(111);

user1.setPassword("1");

user1.setUsername("1");try{//使用这种方式将事务状态都放在同一个事务里面

DefaultTransactionDefinition def = newDefaultTransactionDefinition();

def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);//事物隔离级别,开启新事务,这样会比较安全些。

TransactionStatus status = transactionManager.getTransaction(def); //获得事务状态

transactionStatuses.add(status); testBService.saveUser2(user1);

}catch(Exception e){

e.printStackTrace();

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

}

System.out.println("main insert is over");try{for(int a=0 ;a<3;a++){

ThreadOperation threadOperation= newThreadOperation();

Thread innerThread= newThread(threadOperation);/*innerThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread t, Throwable e){*//*throw new RuntimeException();

log.error("###内部线程发生异常");

e.printStackTrace();*//*// 这边回滚不好使,需要用逻辑删除处理增加的数据

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

}

});*/innerThread.start();

}

}catch(Exception e){

log.error("###线程异常");

e.printStackTrace();

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

}

}public class ThreadOperation implementsRunnable {

@Overridepublic voidrun() {try{//使用这种方式将事务状态都放在同一个事务里面

DefaultTransactionDefinition def = newDefaultTransactionDefinition();

def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);//事物隔离级别,开启新事务,这样会比较安全些。

TransactionStatus status = transactionManager.getTransaction(def); //获得事务状态

transactionStatuses.add(status); User2 user2= newUser2();

user2.setId(count++);

user2.setPassword("10");

user2.setUsername("10");/*** 1.这里如果用其他类的saveUser2方法,在这个线程内事务生效,其他线程不受影响

* 2.如果是用本类的方法,这个线程内的事务不生效,其他线程也不受影响*/testBService.saveUser2(user2);//testBService.

System.out.println("thread insert is over");

}catch(Exception e){

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//throw new RuntimeException();//事务回滚不管用

/*TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

throw new RuntimeException();*/

/*for (TransactionStatus transactionStatus:transactionStatuses) {

transactionStatus.setRollbackOnly();

}*/}

}

}/*** 多线程争夺全局资源

*@paramargs*/

public static voidmain(String[] args){for(int a=0 ;a<100;a++){

ThreadOperation2 threadOperation2= newThreadOperation2();

Thread innerThread= newThread(threadOperation2);

innerThread.start();

}

System.out.println(countTest);

}public static class ThreadOperation2 implementsRunnable {

@Overridepublic voidrun() {

countTest++;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值