mysql默认引擎MyISAM引起的spring事务/session缓存失效
来源:互联网 发布:kinect for windows 编辑:程序博客网 时间:2024/06/03 19:58
感谢:http://blog.csdn.net/zhangdaiscott/article/details/8203807#comments
总结:
1.数据库如无法支持事务(如:mysql采用MyISAM引擎),则spring管理session事务及session的缓存机制全部失效.
首先声明,这个问题涉及到的数据库是MySQL。这是个很奇怪的问题,事务怎么会不回滚呢?
实际上这是个愚蠢的问题,是经验不足导致的,越是奇怪的问题解决起来就越容易。
不回滚的根本原因不在Hibernate,更不是SSH框架,而在MySQL本身。
查看MySQL提供什么存储引擎:mysql>show engines;
(或者:查看MySQL数据库使用的存储引擎:mysql>show variables like '%storage_engine%';)
结果:
从结果上看,我本机当前数据库的默认存储引擎是MyISAM(注意观察Support这一列的值),这就是为什么不回滚的原因:InnoDB支持事务,而MyISAM不支持!其实MyISAM是MySQL默认的存储引擎,在安装MySQL时如果没有指定存储引擎,那么MySQL会默认使用MyISAM,因为它不支持事务,也许效率会比InnoDB高一些。
如果使用的是MyISAM,那么需要将其改为InnoDB,具体方法如下:
1、打开“MySQL_HOME/my.ini”,找到[mysqld],在它的下面有一句话是“skip-innodb”,将其注释掉,即改为:#skip-innodb。
2、在[mysqld]下加上一句“default_table_type=INNODB”(如果写成default-storage-engine=INNODB也可以,两者之间的区别我还没有研究过)
3、重启MySQL服务(注意:是重启服务,不是光退出数据库就完事了!)
4、再次执行mysql> show engines;可以看见默认存储引擎已经变成InnoDB了。
5、原来已经存在的表,如果想使用事务,要修改它的存储引擎,在默认是InnoDB的情况下删除重建。当不想删除的时候,执行alter table 表名 ENGINE = InnoDB;之后执行show table status from 数据库名 where name='表名';
可以查看表状态,看存储引擎是否被修改了。
在使用了InnoDB引擎之后,再次运行代码,回滚成功!
(由于接手了老的项目,mysql引擎全部采用默认的MyISAM,问了架构师是为了:为了快和节省空间???,事务全在代码层面控制???)
- mysql默认引擎MyISAM引起的spring事务/session缓存失效
- autocommit对myisam和innodb引擎的影响,myisam不支持事务,默认引擎
- 对于mysql数据库引擎myISAM不支持事务的了解
- Mysql MyISAM引擎的特征
- MYSQL的存储引擎介绍------MyISAM引擎
- mysql里面的伪事务-----MyISAM存储引擎的锁机制
- spring 事务管理 mysql默认事务
- Spring 事务失效的解决办法
- Spring事务失效的原因
- Spring事务失效的原因
- spring 事务失效的原因
- Spring事务失效的原因
- MySQL的MYISAM引擎的索引方式
- mysql innodb myisam引擎的区别
- MySQL的myisam引擎表锁优化
- Mysql引擎 Innodb和MyISAM的区别
- mysql的 myisam引擎锁问题
- mysql更改引擎(InnoDB,MyISAM)的方法
- Unity发布Android安装文件
- 排序—希尔排序
- 3.3服务扫描与查点
- poj 2406 kmp求连续重复子串的个数
- Groovy闭包深入学习
- mysql默认引擎MyISAM引起的spring事务/session缓存失效
- 3.4网络漏洞扫描
- 超简单的麻将算法
- ML的BD框架-Hadoop.Mahout.Strom.Spark/GraphLab
- 迪克斯特拉算法(Dijkstra)
- 李一男离开华为时给属下的忠告
- android之HttpURLConnection
- 4.15基于metasploit框架的web应用渗透技术
- 怎样破坏程序的堆栈?