了解 Mysql innodb 的事务处理与用法

发布时间:2020-01-17编辑:脚本学堂
Mysql innodb 的事务处理与用法

了解 mysql innodb 的事务处理与用法,感兴趣的朋友可以参考下。

1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认

2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。

注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

测试:
MySQL 预设都会启动 Auto Commit, 要在 InnoDB 做 Transaction 又分两种方法:
BEGIN 直到 COMMIT, ROLLBACK 结束
SET AUTOCOMMIT=0 直到 SET AUTOCOMMIT=1 结束

二者的差别在于:
使用 BEGIN 是当下的做 Transaction 的功能, 一直到 COMMIT 或 ROLLBACK 为止.(之后一样都会 AUTO COMMIT)
使用 SET AUTOCOMMIT 的话, 只要设 0 就是 "在这次的 Connection" 都当作 AUTOCOMMIT是关闭的,不管做几次 COMMIT, ROLLBACK 都一样, 直到设为 1 才算开启 AUTO COMMIT。

不过以上的方法, 都要小心是否要做 Read Lock 的问题。
测试:

复制代码 代码如下:
CREATE DATABASE innodb_test;
CREATE TABLE customers(a int, b char(20), index(a)) TYPE=InnoDB;

#查看 table 的状态
SHOW TABLE STATUS FROM innodb_test LIKE 'customers'G;

# BEGIN 的方法
BEGIN;
INSERT INTO customers VALUES(10, 'abc');
COMMIT; # 此 BEGIN Transaction 已在此结束
SELECT * FROM customers;
INSERT INTO customers VALUES(11, 'aaa');
ROLLBACK; # 此命令是没有作用的, 已经不在 BEGIN 的范围了, 资料会自动 COMMIT 进去.
SELECT * FROM customers;

# SET AUTOCOMMIT 的方法
# (注意: 其它 Connection 並不会因为这 Connection 设定而不自动 COMMIT)
SET AUTOCOMMIT=0;
INSERT INTO customers VALUES(15, 'def');
ROLLBACK;
INSERT INTO customers VALUES(16, 'ggg');
COMMIT;
SELECT * FROM customers;

# 回复每笔交易都会自动 COMMIT 的状态
SET AUTOCOMMIT=1;