Mybatis 不回滚序列

Posted

技术标签:

【中文标题】Mybatis 不回滚序列【英文标题】:Mybatis doesn't Roll Back Sequences 【发布时间】:2018-10-03 23:18:05 【问题描述】:

我在使用 Spring Boot + My Batis Spring Boot 创建测试时遇到问题 我为我的映射器创建了几个 U.Test。对于插入,我使用@SelectKey 注释来获取序列的下一个值。当 Spring 回滚时,事务不会回滚序列,它会在每次应用程序启动时递增它。

FE。

@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = "local")
@SpringBootTest
@Slf4j
@Transactional
public class MultimediaMapperTest 

    @Autowired
    private MultimediaMapper multimediaMapper;

    @Autowired
    private IEmpresasService empresasService;



    @Test
    public void insertArchivo() 
        Multimedia archivo = Multimedia.builder()
                .tiposEntidad(TiposEntidad.EMP)
                .idEntidad(1)
                .awsKey("KEY_AMAZON_WEB_SERVICES")
                .nomFichero("fichero.txt")
                .mime("application/pdf")
                .observaciones("prueba observaciones")
                .build();

        multimediaMapper.insertArchivos(archivo);
        log.debug("Fin de la inserción de ", archivo);
        assertThat(archivo.getIdArchivo(), is(notNullValue()));

    

日志:

第一次开始:

[信息] 2018-04-23 21:44:16,369 [] o.s.c.s.DefaultLifecycleProcessor - 在阶段 2147483647 中启动 bean [信息] 2018-04-23 21:44:16,369 [] s.d.s.w.p.DocumentationPluginsBootstrapper - 上下文刷新 [信息] 2018-04-23 21:44:16,396 [] s.d.s.w.p.DocumentationPluginsBootstrapper - 找到 1 个自定义文档插件 [信息] 2018-04-23 21:44:16,470 [] s.d.s.w.s.ApiListingReferenceScanner - 扫描 api 列表参考 [INFO] 2018-04-23 21:44:16,880 [] 例如 m.a.d.MultimediaMapperTest - 在 7.035 秒内启动 MultimediaMapperTest(JVM 运行 8.255) [信息] 2018-04-23 21:44:18,600 [] ostctTransactionContext - 开始事务 (1) 用于测试上下文 [DefaultTestContext@40d10264 testClass = MultimediaMapperTest, testInstance = es.gogroup.module.archivos.dao.MultimediaMapperTest@6edd4fe2, testMethod = insertArchivo@MultimediaMapperTest,testException = [null],mergedContextConfiguration = [WebMergedContextConfiguration@2773504f testClass = MultimediaMapperTest,位置 = '',类 = 'class es.gogroup.PanchoApplication',contextInitializerClasses = '[]',activeProfiles ='local',propertySourceLocations = '',propertySourceProperties = 'org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true',contextCustomizers = set[org.springframework.boot.test.context.SpringBootTestContextCustomizer@ 2a798d51, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@37afeb11, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2 45b4bdc, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$ Customizer@1b7cc17c], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]];事务管理器 [org.springframework.jdbc.datasource.DataSourceTransactionManager@cfb94fd];回滚 [真] [调试] 2018-04-23 21:44:18,662 [] 例如 m.m.d.M.insertArchivos!selectKey - ==> 准备:SELECT pg_catalog.nextval('"SEQ_MULTIMEDIA"'); [调试] 2018-04-23 21:44:18,689 [] 例如 m.m.d.M.insertArchivos!selectKey - ==> 参数: [调试] 2018-04-23 21:44:18,759 [] egmmdMinsertArchivos!selectKey - 准备:插入多媒体(ID_ARCHIVO,TIPO_ENTIDAD,ID_ENTIDAD,AWS_KEY,NOM_FICHERO,OBSERVACIONES,MIME)值(?,?,?,?, ?, ?, ?) [调试] 2018-04-23 21:44:18,767 [] egmmdMinsertArchivos - ==> 参数:15(整数),EMP(字符串),1(整数),KEY_AMAZON_WEB_SERVICES(字符串),fichero.txt(字符串), prueba observaciones(字符串),应用程序/pdf(字符串) [调试] 2018-04-23 21:44:18,803 [] 例如 m.m.d.M.insertArchivos -

下一个开始:

[信息] 2018-04-23 21:58:15,778 [] ostctTransactionContext - 开始测试上下文的事务 (1) [DefaultTestContext@40d10264 testClass = MultimediaMapperTest, testInstance = es.gogroup.module.archivos.dao.MultimediaMapperTest@6edd4fe2, testMethod = insertArchivo@MultimediaMapperTest,testException = [null],mergedContextConfiguration = [WebMergedContextConfiguration@2773504f testClass = MultimediaMapperTest,位置 = '',类 = 'class es.gogroup.PanchoApplication',contextInitializerClasses = '[]',activeProfiles ='local',propertySourceLocations = '',propertySourceProperties = 'org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true',contextCustomizers = set[org.springframework.boot.test.context.SpringBootTestContextCustomizer@ 2a798d51, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@37afeb11, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2 45b4bdc, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$ Customizer@1b7cc17c], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]];事务管理器 [org.springframework.jdbc.datasource.DataSourceTransactionManager@cfb94fd];回滚 [真] [调试] 2018-04-23 21:58:15,856 [] 例如 m.m.d.M.insertArchivos!selectKey - ==> 准备:选择 pg_catalog.nextval('"SEQ_MULTIMEDIA"'); [调试] 2018-04-23 21:58:15,888 [] 例如 m.m.d.M.insertArchivos!selectKey - ==> 参数: [调试] 2018-04-23 21:58:15,954 [] egmmdMinsertArchivos!selectKey - 准备:插入多媒体(ID_ARCHIVO,TIPO_ENTIDAD,ID_ENTIDAD,AWS_KEY,NOM_FICHERO,OBSERVACIONES,MIME)值(?,?,?,?, ?, ?, ?) [调试] 2018-04-23 21:58:15,964 [] egmmdMinsertArchivos - ==> 参数:16(整数),EMP(字符串),1(整数),KEY_AMAZON_WEB_SERVICES(字符串),fichero.txt(字符串), prueba observaciones(字符串),应用程序/pdf(字符串) [调试] 2018-04-23 21:58:16,001 [] 例如 m.m.d.M.insertArchivos -

【问题讨论】:

您是否尝试过使用您最喜欢的 SQL 客户端模拟此场景? 【参考方案1】:

数据库序列不能回滚。这是一个特性,而不是一个错误。 :)

PostgreSQL:

重要:避免阻塞并发事务 来自同一序列的数字,nextval 操作永远不会滚动 背部;也就是说,一旦获取了一个值,它就被认为是已使用的, 即使执行 nextval 的事务后来中止。这意味着 中止的事务可能会在序列中留下未使用的“漏洞” 赋值。

Oracle:

一旦生成序列号,序列号就可用 仅限于生成该号码的会话。独立于 事务提交或回滚,其他用户引用 order_seq.NEXTVAL 获取唯一值。如果两个用户正在访问 并发相同的序列,然后是每个用户的序列号 接收可能有间隙,因为序列号也在 由其他用户生成。

SQL Server:

序列号是在当前范围之外生成的 交易。它们被消耗的事务是否使用 序列号被提交或回滚。

【讨论】:

以上是关于Mybatis 不回滚序列的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 回滚记录

mybatis 手动/自动触发事务回滚

MyBatis:事务回滚

mybatis批量导入 ,出现异常全部不添加(回滚)

Mybatis 事物回滚最简单的操作方式

SSM-MyBatis-09:Mybatis中SqlSession的close为什么能造成事务的回滚