• Spring @Transactional失效与否


    package xyz.pascall.mybatis.spring.boot.learn.service.impl;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import xyz.pascall.mybatis.spring.boot.learn.entity.User;
    import xyz.pascall.mybatis.spring.boot.learn.mapper.UserMapper;
    import xyz.pascall.mybatis.spring.boot.learn.service.UserService;
    
    /**
     * UserServiceImpl
     *
     *  Spring事务失效原因:
     *      原因一:是否是数据库引擎设置不对(mysql:MyISAM,InnoDB)
     *      原因二:入口方法必须是public(Spring AOP特性决定)(不生效:private, final, static)
     *      原因三:Spring的事务管理默认只对运行期异常进行回滚
     *      原因四:@EnableTransactionManagement // 启注解事务管理 === <tx:annotation-driven />
     *          @EnableTransactionManagement 在springboot1.4后可不写,只支持Mybatis和Hibernate
     *          1.框架在初始化时默认注入两个事务管理器的Bean(JDBC->DataSourceTransactionManager(Mybatis) 
    *                              JPA->JpaTransactionManager(Hibernate) ) * 2.当然如果不是AutoConfig的而是自己自定义的,使用该注解开启事务 * 原因五:请确认你的类是否被AOP代理 * 原因六:请确保你的业务和事务入口在同一个线程里 * 原因七:service方法中调用本类中的另一个方法,事务没有生效 * 1.事务无效:无事务方法调用有事务方法(有异常) * @Override * public void addInfo(final String name) { * create(name); * } * @Transactional * public int create(String name) { * User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); * Integer result = userMapper.add(user); * int i = 1/0; * return i; * } * 2.事务有效:有事务方法调用有事务方法(有异常) * @Transactional * @Override * public void addInfo(final String name) { * create(name); * } * @Transactional * public int create(String name) { * User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); * Integer result = userMapper.add(user); * int i = 1/0; * return i; * } * 3.事务有效:有事务方法(有异常)调用有事务方法 * @Transactional * @Override * public void addInfo(final String name) { * create(name); * int i = 1 / 0; * } * @Transactional * public int create(String name) { * User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); * return userMapper.add(user); * } * 4.事务有效:有事务方法(有异常)调用无事务方法 * @Transactional * @Override * public void addInfo(final String name) { * create(name); * int i = 1 / 0; * } * public int create(String name) { * User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); * return userMapper.add(user); * } * 5.事务有效:有事务方法调用无事务方法(有异常) * @Transactional * @Override * public void addInfo(final String name) { * create(name); * } * public int create(String name) { * User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); * Integer result = userMapper.add(user); * int i = 1/0; * return i; * } * 6.事务有效:无事务方法(注入本对象)调用有事务方法(有异常) * @Override * public void addInfo(final String name) { * userService.create(name); * } * @Transactional * public int create(String name) { * User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); * Integer result = userMapper.add(user); * int i = 1/0; * return i; * } * *
    @author Jie Zhang, 2019/7/31 * @version DEMO v1.0 */ @Service @Slf4j public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private UserService userService; @Override public User getUser(Integer id) { return userMapper.getUser(id); } @Override public PageInfo<User> query(Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 5 : pageSize, true); return new PageInfo<>(userMapper.query()); } @Override public void addInfo(final String name) { userService.create(name); } @Transactional public int create(String name) { User user = new User().setName(name).setAge(30).setEmail(name + "@qq.com"); log.info(String.valueOf(userMapper.add(user))); int i = 1/0; return i; } }
  • 相关阅读:
    【Mysql】Mysql在Linux操作系统下在线安装
    【Mysql】Mysql实战:分页查询、(批量)添加、修改、(批量)删除
    【Nginx】Ngnix在Linux操作系统下的安装及搭建
    【Linux】Shell-解压/压缩、软件安装(jdk、tomcat)
    【Linux】用户创建修改切换、文件权限管理
    【Linux】文件操作命令、管道命令、文件编辑命令(VI)
    kafka学习 回顾以及新知识
    Scale Up 和 Scale Out存储架构
    计算机五层网络模型--回顾
    kafka学习(一)
  • 原文地址:https://www.cnblogs.com/pascall/p/11274890.html
Copyright © 2020-2023  润新知