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++;
}
}
}