Mysql数据库InnoDB表和MyISAM表混用后,事务回滚测试。

测试环境CENTOS7.3+MYSQL5.7

一张表使用InnoDB引擎,表名称 innodb_test

另外一张表使用MyISAM引擎,表名称 innodb_test

在事务操作的时候,看看到底会发生什么情况。

表结构相同只有3个字段id,name, money
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | char(30) | YES | | NULL | |
| money | decimal(11,2) | YES | | NULL | |
+-------+---------------+------+-----+---------+----------------+

两张表都只有一条数据

+----+----------+---------+
| id | name | money |
+----+----------+---------+
| 1 | colinshi | 1000.00 |
+----+----------+---------+

先关闭了自动事务提交

mysql> SET AUTOCOMMIT =0;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘autocommit‘ ;

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
mysql> begin;

开始事务操作,这次测试成功commit

mysql> update innodb_test set money=500 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update myisam_test set money=500 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from innodb_test;
+----+----------+--------+
| id | name | money |
+----+----------+--------+
| 1 | colinshi | 500.00 |
+----+----------+--------+
1 row in set (0.00 sec)

mysql> select * from myisam_test;
+----+----------+--------+
| id | name | money |
+----+----------+--------+
| 1 | colinshi | 500.00 |
+----+----------+--------+
1 row in set (0.00 sec)

在成功commit的情况下数据库没有问题。都成了500,那么如果提交错误需要回滚会是什么情况呢。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update myisam_test set money=300 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update innodb_test set money=300 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from myisam_test;
+----+----------+--------+
| id | name | money |
+----+----------+--------+
| 1 | colinshi | 300.00 |
+----+----------+--------+
1 row in set (0.00 sec)

mysql> select * from innodb_test;
+----+----------+--------+
| id | name | money |
+----+----------+--------+
| 1 | colinshi | 500.00 |
+----+----------+--------+
1 row in set (0.00 sec)

发现MyISAM表并没有进行回滚操作,而InnoDB表进行了回滚操作。

也就是说一个事务如果同时处理了MyISAM引擎表,InnoDB引擎表,那么回滚会出现数据不一致的情况。

我还直接使用了python的mysql对数据库使用了事务操作结果和mysql客户端是相同情况

import pymysqlimport time

def delSql(dzp_id):    conn = pymysql.connect(host=‘192.168.1.71‘, user=‘root‘, passwd=‘!QAZ2wsx‘, db=‘colinshitop‘)    cur = conn.cursor()    cur.execute(‘use colinshitop‘)    try:        cur.execute("update innodb_test set money=‘{}‘  WHERE id = 1".format(dzp_id))        cur.execute("update myisam_test set money=‘{}‘  WHERE id = 1".format(dzp_id))        cur.execute("INSERT into name (‘name‘, ‘fdjaskfjsa‘) VALUES (‘fdkjakf‘, ‘值2‘)")        conn.commit()        print(‘提交commit‘)    except:        conn.rollback()        print(‘回滚rollback‘)    finally:        cur.close()        conn.close()

if __name__ == ‘__main__‘:    dzp_id = input(‘请输入金额:‘,)    delSql(dzp_id)    print(‘5秒后程序终止‘)    time.sleep(5)

数据库中尽量不要同时用InnoDB表和MyISAM表混用。如果真的迫不得已需要混用,一定不能同一个事务同时对两种表引擎操作。

原文地址:https://www.cnblogs.com/colinshi/p/9156539.html

时间: 2024-08-02 01:55:24

Mysql数据库InnoDB表和MyISAM表混用后,事务回滚测试。的相关文章

mysql数据库InnoDB和MyISAM区别以及如何选择

mysql数据库InnoDB和MyISAM区别以及如何选择: 区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务: 2. InnoDB支持外键,而MyISAM不支持.对一个包含外键的InnoDB表转为MYISAM会失败: 3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高.但是辅助索引需要两次查询,先查询

mysql数据库同步可以针对单张表同步吗?解决办法

mysql数据库同步可以针对单张表同步吗?第一个问题:mysql数据库同步可以针对单张表同步吗? 也就是说1.数据库A里面有a1,a2,a3三张表,数据库B里面只有一张a1表(A与B的a1的表结构式一样的)2.数据库B只同步数据库A中的a1表3.数据库A也要同步B的a1表 注:其实可以认为是数据库A与数据库B的a1表双向同步,即A数据库a1数据有改变,,B数据库a1也要相应改变,同理B数据库a1有改变,A数据库a1也要改变(Aa1<=>Ba1) 第二个问题:配置数据库同步linux与windo

MySQL数据库InnoDB存储引擎中的锁机制--转载

原文地址:http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本类型 数据库上的操作可以归纳为两中,读和写.多个

MySQL数据库InnoDB引擎下服务器断电数据恢复

说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时找不到数据库中的表,造成网站无法正常访问. 分析: 1.MySQL数据库,使用拷贝文件方式来恢复数据库,只支持MyISAM引擎: 2.如果有数据库或数据表使用了InnoDB引擎,恢复的时候,必须连同MySQL数据库目录下的ibdata1文件一起拷贝过来. 解决办法: 1.停止MySQL服务 serv

MySQL数据库InnoDB存储引擎中的锁机制

MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解InnoDB存储引擎实现的多版本控制技术(简称:MVCC). 基本知识 假设对于多版本控制(MVCC)的基础知识,有所了解.MySQL数据库InnoDB存储引擎为了实现多版本的一致性读,采用的是基于回滚段的协议. 行结构 MySQL数据库InnoDB存储引擎表数据的组织方式为主键聚簇索引.由于采用索引

MySQL数据库InnoDB存储引擎

MySQL数据库InnoDB存储引擎Log漫游  http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/ MySQL数据库InnoDB存储引擎,布布扣,bubuko.com

Mysql数据库无法使用事务回滚

package jdbc02; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import jdbc02.*; public class TransactionTest { /**  * Tom 给Jerry 汇款500元  *   * 关于事务:  * 1. 如果多个操作,每个操作使用的是自己的单独的连接,则无

mysql事务回滚

mysql使用事务前需确定存储引擎为innodb,譬如删除一个人员数据,会删除和这个人有关的一些数据删除,这个时候就会用到事务,出现一个删除错误整个删除事务就会取消. 事务回滚步骤: /*创建roll表*/CREATE TABLE roll(    id int unsigned primary key auto_increment comment '主键',    names varchar(64) not null default '' comment '姓名')CHARSET =UTF8