MySQL事务

一、查看服务器上MySQL支持的ENGINE

SHOW ENGINES;

只有InnoDB支持transaction。

二、查看数据库事务提交方式

SELECT @autocommit;

运行此语句,结果是,

mysql> select @autocommi
+-------------+
| @autocommit |
+-------------+
| NULL        |
+-------------+
1 row in set (0.03 sec)

这说明,我的MySQL是手动提交事务的。而在MyISAM情况下,是不支持事务的,虽然一旦运行了一条语句就不可恢复,也不能据此认为事务提交状态是自动的,因为根本就和事务没有关系。

三、如何使用事务

我没有掌握,不知道如何开启事务,如何结束事务。或者说,我看到了多种方法,不知道究竟应该用那种方法。不过,我可以暂时用下面的SQL语句来使用事务。下面的代码,通过了测试。

MyISAM table

-- 结合该文件和trans-tables.sql理解非事务性表和事务性表
-- Filename:non-trans-tables.sql

DROP TABLE IF EXISTS non_trans_parent;
CREATE TABLE non_trans_parent
(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	val VARCHAR(10) NOT NULL,
	PRIMARY KEY(id),
	UNIQUE KEY(val)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS non_trans_child;
CREATE TABLE non_trans_child
(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	parent_id INT UNSIGNED NOT NULL,
	created TIMESTAMP NOT NULL,
	PRIMARY KEY(id),
	INDEX (parent_id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- Test
START TRANSACTION;
INSERT INTO non_trans_parent(val) VALUES ('a');
INSERT INTO non_trans_child(parent_id,created) VALUES (LAST_INSERT_ID(),NOW());


InnoDB table

-- 结合该文件和trans-tables.sql理解非事务性表和事务性表
-- Filename:trans-tables.sql

DROP TABLE IF EXISTS trans_parent;
CREATE TABLE trans_parent
(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	val VARCHAR(10) NOT NULL,
	PRIMARY KEY(id),
	UNIQUE KEY(val)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS trans_child;
CREATE TABLE trans_child
(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	parent_id INT UNSIGNED NOT NULL,
	created TIMESTAMP NOT NULL,
	PRIMARY KEY(id),
	INDEX (parent_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Test
START TRANSACTION;
INSERT INTO trans_parent(val) VALUES ('a');
INSERT INTO trans_child(parent_id,created) VALUES (LAST_INSERT_ID(),NOW());


这两个table的唯一区别是使用的ENGINE不同。

在测试中,运行上述代码后,我再执行下面的代码

INSERT INTO trans_parent(val) VALUES ('a');

INSERT INTO non_trans_parent(val) VALUES ('a');

之后,再分别执行ROLLBACK,发现,在MyISAM的表中,表并没有恢复到事务之前的状态,而在InnoDB中,表恢复到了事务之前的状态。这就是事务性表和非事务性表的差别。

此外,我还发现,开启事务,用的语句是

START TRANSACTION;

提交事务,语句是

COMMIT;

而相关的网络资料是这样的:

MYSQL的事务处理主要有两种方法。
   1、用begin,rollback,commit来实现
        begin 开始一个事务
        rollback 事务回滚
        commit  事务确认
    2、直接用set来改变mysql的自动提交模式
       MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
      set autocommit=0   禁止自动提交
      set autocommit=1 开启自动提交
   来实现事务的处理。
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!

URL:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html

这种方法,和我测试通过的代码开启事务的方法不同。对于网络资料中的第二种,我也不理解。在上面的trans_table.sql中,需要commit后事务数据才不可回滚,这是否说明,我的MySQL是默认禁止非自动提交的。有待研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值