InnoDB事务的开启
2015-10-26 20:38
429 查看
准备表结构:
建立innodb引擎的表t_i
CREATE TABLE `t_i` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
建立myisam引擎的表t_m
CREATE TABLE `t_m` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
事务的开启分以下两种方式:
查看默认的自动提交是否开启:
(root@localhost) [wzy]> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
当默认情况是自动提交时,需要使用如下命令开启innodb的事务
(root@localhost) [wzy]> begin;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [wzy]> insert into t_i values(1);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> select * from t_i;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
(root@localhost) [wzy]> commit;
Query OK, 0 rows affected (0.01 sec)
最后使用commit提交事务
关闭默认的自动提交事务
(root@localhost) [wzy]> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [wzy]> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
在这种情况下就不用begin开启事务,直接执行DML语句
(root@localhost) [wzy]> insert into t_i values(2);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> commit;
Query OK, 0 rows affected (0.00 sec)
注意:如果已经关闭自动提交事务,就不要再使用begin开启事务,否则可能出现就算提交事务,在其它session里也看不到数据。
问题:在同一个事务里分别向innodb表和myisam表里插入数据,但没有提交事务,请问在另外一个事务里能否看到myisam表里的数据?
使用上面创建的两张表测试,在session1里执行如下语句:
(root@localhost) [wzy]> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
(root@localhost) [wzy]> insert into t_i values(3);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> insert into t_m values(1);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> select * from t_i;
+------+
| a |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
(root@localhost) [wzy]> select * from t_m;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
在session2里执行如下语句,查看结果
(root@localhost) [wzy]> select * from t_i;
+------+
| a |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
(root@localhost) [wzy]> select * from t_m;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
可见,在开启事务的情况下,向myisam引擎表插入数据,就算没有提交事务,在另外的事务里也能看到数据。
建立innodb引擎的表t_i
CREATE TABLE `t_i` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
建立myisam引擎的表t_m
CREATE TABLE `t_m` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
事务的开启分以下两种方式:
查看默认的自动提交是否开启:
(root@localhost) [wzy]> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
当默认情况是自动提交时,需要使用如下命令开启innodb的事务
(root@localhost) [wzy]> begin;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [wzy]> insert into t_i values(1);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> select * from t_i;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
(root@localhost) [wzy]> commit;
Query OK, 0 rows affected (0.01 sec)
最后使用commit提交事务
关闭默认的自动提交事务
(root@localhost) [wzy]> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [wzy]> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
在这种情况下就不用begin开启事务,直接执行DML语句
(root@localhost) [wzy]> insert into t_i values(2);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> commit;
Query OK, 0 rows affected (0.00 sec)
注意:如果已经关闭自动提交事务,就不要再使用begin开启事务,否则可能出现就算提交事务,在其它session里也看不到数据。
问题:在同一个事务里分别向innodb表和myisam表里插入数据,但没有提交事务,请问在另外一个事务里能否看到myisam表里的数据?
使用上面创建的两张表测试,在session1里执行如下语句:
(root@localhost) [wzy]> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
(root@localhost) [wzy]> insert into t_i values(3);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> insert into t_m values(1);
Query OK, 1 row affected (0.00 sec)
(root@localhost) [wzy]> select * from t_i;
+------+
| a |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
(root@localhost) [wzy]> select * from t_m;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
在session2里执行如下语句,查看结果
(root@localhost) [wzy]> select * from t_i;
+------+
| a |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
(root@localhost) [wzy]> select * from t_m;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
可见,在开启事务的情况下,向myisam引擎表插入数据,就算没有提交事务,在另外的事务里也能看到数据。
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法