问题引入
在测试sprin事务遇到异常后的回滚操作时,发现回滚失败,仍然会扣钱。
分析原因
一开始以为是代码的问题,仔细分析比对代码后发现没有错误,且其他人运行是可以正常实现回滚的。因此猜测是数据库的原因。
查找资料后发现,使用的mysql数据库有多种存储引擎,例如MyISAM、InnoDB等。而MyISAM是不支持事务的!!!
那怎么知道自己使用的是什么引擎呢?
查看使用引擎
使用sql语句如下,tbl_account为表名:
show create table tbl_account;
查询结果如下,ENGINE=InnoDB 说明使用的引擎是InnoDB。(此处是更改后的,我的原先是MyISAM)
更改引擎
有两种更改方法,一个是更改某个表的引擎,一个是更改默认的引擎(新建表所使用的)。
更改某个表的引擎
使用sql语句如下,tbl_account为表名:
ALTER TABLE tbl_account ENGINE = InnoDB;
更改默认的引擎
找到mysql目录下的my.ini文件。
用记事本打开后,更改如下图所示(;代表注释):
最后再次执行前面的语句查看表的引擎,确认是否更改成功。更改成功后就可以成功实现事务回滚了。
(by 归忆)