搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis。
在启动类Main 类上加上对事物的支持的注解 @EnableTransactionManagement
在相关的service类中update()加上开启事物注解 @Transactional
在update()方法中设置除数为0 , 为使运行时抛异常而回滚事务。
可是奇葩的问题来了,抛出了除数为0的异常,但是事物也提交成功了,查了下原因,后来发现是mysql数据库引擎的问题。
检查你的数据库支持哪些引擎:
mysql> show engines;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO
查询当前数据库默认的引擎 :
mysql> show variables like '%storage_engine%';
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| storage_engine | MyISAM |
+----------------+--------+
1 row in set (0.00 sec)
看某个表用了什么引擎:
show create table 表名
修该表的存储引擎的方法:
1. alter table 表名 ENGINE = InnoDB;
2. 修改配置文件my.cnf,在[mysqld]最后添加为上default-storage-engine=InnoDB,重启数据库服务,数据库默认的引擎修改为InnoDB
3. 建表的时候指定 eg: create table t_user( id int primary key,name varchar(50) ) engine=InnoDB;
4. 批量生成某个库的的修改引擎语句,执行生成的这些语句即可
SELECT CONCAT('ALTER TABLE ',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE table_schema='数据库的名称' AND ENGINE='myisam';