zoukankan      html  css  js  c++  java
  • spring data jpa使用@Transactional注解开启事务后失败不回滚

      如题,在数据库批量操作方法上使用@Transactional注解,其中一条数据抛出异常了,却死活不回滚。

      批量操作方法是公有的,spring也是默认支持事务的,排除代码层面问题,那么就看看数据库是否支持事务吧:

    mysql> show engines;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    9 rows in set (0.01 sec)

      我们看到,只有InnoDB支持事务,那么我操作的表使用了哪个引擎呢:

    mysql> show create table t_order;
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | t_order | CREATE TABLE `t_order` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `access_channel` varchar(32) DEFAULT NULL,
      `address` varchar(512) DEFAULT NULL,
      `area` varchar(32) DEFAULT NULL,
      `channel` varchar(50) DEFAULT NULL,
      `linkphone` varchar(32) DEFAULT NULL,
      `name` varchar(32) DEFAULT NULL,
      `oprcode` varchar(32) DEFAULT NULL,
      `oprtime` varchar(32) DEFAULT NULL,
      `order_id` varchar(32) NOT NULL,
      `servernum` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 |
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)

      明显不对,改成InnoDB吧:

    mysql> alter table t_order engine=InnoDB;
    Query OK, 0 rows affected (0.16 sec)
    Records: 0  Duplicates: 0  Warnings: 0

      再确认下:

    mysql> show create table t_order;
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | t_order | CREATE TABLE `t_order` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `access_channel` varchar(32) DEFAULT NULL,
      `address` varchar(512) DEFAULT NULL,
      `area` varchar(32) DEFAULT NULL,
      `channel` varchar(50) DEFAULT NULL,
      `linkphone` varchar(32) DEFAULT NULL,
      `name` varchar(32) DEFAULT NULL,
      `oprcode` varchar(32) DEFAULT NULL,
      `oprtime` varchar(32) DEFAULT NULL,
      `order_id` varchar(32) NOT NULL,
      `servernum` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 |
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)

      再跑批量方法,事务终于回滚了。

  • 相关阅读:
    图数据库-Neo4j使用
    [原创]networkx 画中文节点
    python networkx:绘制网络图
    Python二维数组,坑苦了
    xgboost
    python 机器学习
    计算机网络知识
    前端优化不完全指南(转)
    FlashFXP 4.3.1 注册码
    你真的会使用Chrome开发者工具吗?
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/12061072.html
Copyright © 2011-2022 走看看