我们用@Transactional注解标注方法开启事务时,测试的时候事务并没有生效。
这是service层的代码,开启事务,并且插入两条数据
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional
public void saveTwo(){
Girl girlOne = new Girl();
girlOne.setCupSize("D");
girlOne.setAge(55);
girlRepository.save(girlOne);
Girl girlTwo = new Girl();
girlTwo.setCupSize("A");
girlTwo.setAge(14);
girlRepository.save(girlTwo);
}
}
这是Controller层,调用service层的方法
@PostMapping(value = "/girls/two")
public void saveTwo(){
girlService.saveTwo();
}
比如我在service层把cupSize设置的字符长度超过数据库表字段要求的长度,本应该两条数据都不插入,可是,还是有一条插入了,另一条抛出异常。
后来发现,我在配置文件中设置了
ddl-atuo :update
也就是springboot帮我们根据实体类创建的表,这个表呢默认的引擎不是inoodb,而是MyISAM,哈哈,现在知道原因了吧,myisam不支持事务,所以我们把表的引擎改为innodb,所有的问题就解决了,事务也生效了。
附上查看数据库表引擎的语法:
会查询所有表的引擎
show table status;
结果
查看数据库某个表的引擎
show table status from db_name where name='table_name';
结果
修改表引擎
alter table tablename engine innodb;