事务和memory表

从一个实际问题说起:

        部门有个老项目是14年的,用的mysql,今天修改其中的一个业务,因为也不是很了解这个项目,业务是改对了,但是白盒的时候发现事务直接提交,并没有回滚,查了好长好长好长。。。时间,事务为何不生效,最终还是之前的老同事才发现的,塔喵的用的memory表,那么这时候memory表就说了,我们不一样,不一样,不一样。。。(怎么这么顺口,而且很上头)。

        通常情况下,我们在mysql中建表都是innerdb的引擎,也不知道为啥这个系统当时用了缓存表,那么到底什么是缓存表:

       1.建表的使用自己选在engine,缓存表就是使用engine为memory的表。

       2.关于缓存表:

            1、memory引擎表数据只存放在内存中,插入数据后,文件也只有表结构文件,没有表数据文件, 重启后,数据丢失 ,但是表结构还在,表结构文件也还在

            2、memory引擎表,一个会话修改了数据,其他会话可以立即看到修改后的数据,和oracle的临时表完全不同

            3、要清空memory引擎表,delete、truncate、drop、重启都可以,没有类似oracle这样的flush buffer_cache的直接清空内存的方法

            4、memory引擎表最大大小受参数max_heap_table_size的限制,具体见官方文档

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_heap_table_size

            5、也就是说,momory引擎的表,除了这两点,表数据放在内存中、重启后数据丢失,其他一切都和普通表一样。

            6、生产环境不建议使用memory引擎,因为它有两个最大的缺点,其一它只有表锁没有行锁,这样一旦表有更新操作,就会堵塞其他会话对这张表的读写。其二它的数据存放在内存中,一旦在M-S架构中,S从库重启,S从库数据就会丢失,但是M主库数据还在,继而影响主从同步,因为重启后如果收到一条update语句后,主库正常执行,把该语句发送到从库就会报错找不到更新的行,导致主从同步停止。

            7、memory引擎不支持事务,也是因为它独特的数据存储位置和锁的特性决定的,这点很重要,因为通常我们开发时比如用spring,开启事务后都是AOP的,有的开发者不会去关心它,默认开启事务,那么就一定是支持事务的,就像我,如果不是自己做白盒都不会理会这个问题。

            8、如果非要用memory引擎的优点,把数据存放在内存中,可以考虑使用memory引擎临时表,正好可以避免上面6的两个缺点。

        附带spring事务不生效的原因:

            看这个文章https://blog.csdn.net/u010979642/article/details/105217158/ 总结的非常好,包括了上面说的情况

        这里只是记录下正常开发中遇到的问题,防止忘了,加深下印象,如果对你有帮助,那就给个赞吧!哈哈。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值