百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

spring事务传播行为(spring事务传播特性使用场景)

bigegpt 2024-08-01 12:02 11 浏览

  • 什么是事务传播
  • 简单来说就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。比如事务方法A()调用事务方法B()时,事务方法B()是继续在A()的事务中运行还是单独新建使用自个的事务B,这就取决于事务方法B()的事务传播行为

    //service1
    
    @Transactional(propagation = Propagation.REQUIRED)
    
    public void B() {}
    
    //service2
    
    @Transactional(propagation = Propagation.REQUIRED)
    
    public void A() {
    
        B()
    
    }

    A() 和 B()方法都开启了事务,而A()方法调用了B()。

    spring提供的七种事务传播行为

    1. REQUIRED:表示当前方法必须运行在事务中,如果当前方法没有运行在事务中,就新建一个事务,如果当前方法已存在于一个事务中,就加入到这个事务中,在该事务中运行
    2. SUPPORTS:表示当前方法是否已经存在于一个事务,如果当前方法已经在一个事务中,就加入该事务,否则就以非事务方法执行,相当于普通方法。
    3. MANDATORY:表示当前方法必须运行在一个事务中,如果没有在一个事务中会抛出异常。IllegalTransactionStateException:No existing transaction found for transaction marked with propagation 'mandatory'
    4. REQUIRES_NEW:表示当前方法必须运行在自己的事务中,如果已经存于一个事务中,则挂起该事务,重新开启一个属于自己的事务。也就是当前方法的事务不受其他事务影响
    5. NOT_SUPPORTED:表示当前方法不在事务中运行,如果已经存在于一个事务中,则将该事务挂起,否则则视为普通非事务方法运行。
    6. NEVER:表示当前方法不在事务中运行,如果已经存在于一个事务中,则抛出一个异常,否则则视为普通非事务方法运行
    7. NESTED:表示当前方法已经运行在一个事务中,则在嵌套在事务内执行,嵌套事务可以单独的提交和回滚,但是如果主事务提交或回滚,会顺带着嵌套事务提交或回滚,嵌套事务出现异常,主事务可以有选择的回滚或不回滚,可以在主事务方法中catch子方法的异常,catch后其他方法就不会受到影响。如果当前没有事务,则执行与REQUIRED类似的操作


    以上说法可能并不能很好的理解下面我们通过伪代码演示一下每个行为

    一、验证Propagation.REQUIRED

    1.子方法添加事务并使用REQUIRED,父方法不添加事务

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    ******************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果为:


    我们发现只有parent被插入到数据库中,而两个children则没有,这是因为在saveChildren()方法中发生了 / by zero 异常,所以会进行事务回滚,已经插入的children1被清除。

    子方法被父方法调用,父方法没有事务,因而子方法没有运行在事务中,所以子方法新建一个事务并运行


    2.子方法不添加事务,父方法添加事务并使用REQUIRED

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    ********************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();

    运行结果为:

    我们发现数据库中一条记录也没有被添加,这是因为在子方法saveChildren()方法中发生了 / by zero 异常,子方法异常被父方法感知到,所以会进行全部回滚处理


    3.子方法添加事务,父方法添加事务,都使用REQUIRED

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    ********************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();
    
    


    运行结果:

    结果也是一条记录都没有

    对于子方法来说,当前已经存在一个父方法的事务,而且子方法被@Transactional(propagation = Propagation.REQUIRED) 修饰,所以子方法会加入到父方法的事务中


    二、验证Propagation.SUPPORTS


    1.子方法加入@Transactional(propagation = Propagation.SUPPORTS),父方法为普通方法

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.SUPPORTS)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();
    
    


    运行结果:


    通过结果我们发现,虽然在子方法上加入@Transactional(propagation = Propagation.SUPPORTS) 但是结果却是跟非事务方法结果一致,下面我们在将父方法添加事务看下结果

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.SUPPORTS)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    我们在父方法上添加@Transactional(propagation = Propagation.REQUIRED) 子方法上加入 @Transactional(propagation = Propagation.SUPPORTS)


    运行结果:


    也就是说当父方法有事务时,子方法会加入到父方法的事务中,否则就按非事务方法也就是普通方法运行。


    三、验证Propagation.MANDATORY


    1.子方法添加@Transactional(propagation = Propagation.MANDATORY) ,父方法为普通方法

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.MANDATORY)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    子方法直接报错:

    org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

    2.子方法添加@Transactional(propagation = Propagation.MANDATORY) ,父方法添加@Transactional(propagation = Propagation.REQUIRED)

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.MANDATORY)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    子方法加入到父方法的事务中,子方法异常,事务整体回滚


    四、验证Propagation.REQUIRES_NEW

    1. 子方法使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 父方法为普通方法

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRES_NEW)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    仅在子方法中开启事务,子方法saveChildren()事务回滚


    2. 子方法使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 父方法使用 @Transactional(propagation = Propagation.REQUIRED)

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRES_NEW)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    子方法虽然单独运行一个事务,但是异常被父方法识别到,所以父方法事务进行了回滚


    3.下面我们调整一下,将子方法中除0异常转移到父方法中,再看下结果

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRES_NEW)
    
        public void saveChildren() {
    
            saveChild1();
    
            //int a = 1 / 0; 将这个异常语句注释掉添加到父方法中
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
            int a = 1 / 0; //新增一个异常语句
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    通过结果我们可以看到,父方法出现异常,但是仅仅回滚了saveParent()方法。而saveChildren()则正常保存到数据库中,没有发生回滚。

    也就是说REQUIRES_NEW 是新启动一个事务,它所在的已经存在的那个事务会被挂起。


    五、验证Propagation.NOT_SUPPORTED

    1.子方法上加入@Transactional(propagation = Propagation.NOT_SUPPORTED),父方法为普通非事务方法

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.NOT_SUPPORTED)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    通过结果可以看出,该子方法以非事务方式运行


    2.子方法上加入@Transactional(propagation = Propagation.NOT_SUPPORTED),父方法上加入 @Transactional(propagation = Propagation.REQUIRED)

    @Service
    
    public class StuServiceImpl implements IStuService {
    
        @Autowired
    
        private StuMapper stuMapper;
    
        @Override
    
        public void saveParent() {
    
            Stu stu = new Stu();
    
            stu.setName("parent");
    
            stu.setAge(19);
    
            stuMapper.insert(stu);
    
        }
    
        @Override
    
        @Transactional(propagation = Propagation.NOT_SUPPORTED)
    
        public void saveChildren() {
    
            saveChild1();
    
            int a = 1 / 0;
    
            saveChild2();
    
        }
    
        public void saveChild1() {
    
            Stu stu1 = new Stu();
    
            stu1.setName("child-1");
    
            stu1.setAge(11);
    
            stuMapper.insert(stu1);
    
        }
    
        public void saveChild2() {
    
            Stu stu2 = new Stu();
    
            stu2.setName("child-2");
    
            stu2.setAge(22);
    
            stuMapper.insert(stu2);
    
        }
    
        
    
    }
    
    **********************************************************************************************
    
    @Service
    
    public class TestServiceImpl implements ITestService {
    
            //注入上面的service
    
        @Autowired
    
        private IStuService iStuService;
    
        @Override
    
        @Transactional(propagation = Propagation.REQUIRED)
    
        public void testTrans() {
    
            iStuService.saveParent();
    
            iStuService.saveChildren();
    
        }
    
    }
    
    .........
    
    调用testTrans();


    运行结果:

    从结果我们可以看出,该子方法以非事务方式运行,而该方法的异常被父方法识别到后父方法进行了回滚

    相关推荐

    得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

    一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

    warm-flow新春版:网关直连和流程图重构

    本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

    扣子空间体验报告

    在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

    spider-flow:开源的可视化方式定义爬虫方案

    spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

    solon-flow 你好世界!

    solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

    新一代开源爬虫平台:SpiderFlow

    SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

    通过 SQL 训练机器学习模型的引擎

    关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

    鼠须管输入法rime for Mac

    鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

    Go语言 1.20 版本正式发布:新版详细介绍

    Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

    iOS 10平台SpriteKit新特性之Tile Maps(上)

    简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

    程序员简历例句—范例Java、Python、C++模板

    个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

    Telerik UI for iOS Q3 2015正式发布

    近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

    ios使用ijkplayer+nginx进行视频直播

    上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

    IOS技术分享|iOS快速生成开发文档(一)

    前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

    macOS下配置VS Code C++开发环境

    本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...