zoukankan      html  css  js  c++  java
  • mysql表类型导致的 setRollbackOnly() 事务不回滚

    在SpringBoot 中,使用事务非常简单,只需在方法上面加入 @Transactional  注解就可以实现。也可加在类上,此时则类中所有方法都支持事务。

    而当我使用下面代码时,发现事务却没有回滚,异常之前的数据仍然插入了数据库

        @Transactional
        @RequestMapping(value="/create", method=RequestMethod.POST)
        public Resp createUser(String name, String phone, String password){    
            try {
                //...
                
            } catch (Exception e) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                //...
    
                return Resp.error(Resp.ErrorCode.USER_CREATE, null);
            }
            return Resp.success();
        }

    在各种尝试之后,最后发现是mysql中的表类型是MyISAM,而MyISAM存储引擎的一个特点就是不支持事务

    解决方法:

    之前在配置文件中的设置(使用的默认的存储引擎)

    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

    修改为(指定为InnoDB)

    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
  • 相关阅读:
    LVM
    Linux 压缩归档
    <基础> PHP 字符串操作
    <基础> PHP 数组操作
    PHP 文件操作类(转载)
    Linux 磁盘管理(分区、创建文件系统、挂载)
    文件系统(File System)
    Linux 硬链接、软链接
    Django基础一
    数据库约束
  • 原文地址:https://www.cnblogs.com/wenhui92/p/7684746.html
Copyright © 2011-2022 走看看