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

 

posted @ 2019-07-31 10:57  张界  阅读(233)  评论(0编辑  收藏  举报