DBA MySQL使用事务
功能概述
事务是InnoDB
存储引擎的一大亮点,开启事务后即可以对一组SQL
语句进行一个原子化的操作,即如果这一组SQL
语句中有一条发生错误,那么其他的同组SQL
就都不会被执行。
事务的核心特点ACID
如下:
Atomic原子性:
所有语句作为一个单元必须全部成功执行或或全部取消,不能出现中间状态
Consistent一致性:
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态
Isolated(隔离性):
事务之间不相互影响
Durable(持久性):
事务成功完成后,所做的所有更改都会准确地记录在数据库中,所做的更改不会丢失
标准事务
标准事务的开启方法与基本格式如下:
# 开启标准事务可使用BEGIN或者START TRANSACTION
# 标准事务语句是指必须被COMMIT或者ROLLBACK的操纵语句
# INSERT UPDATE DELETE
# 执行完COMMIT或者ROLLBACK后标准事务自动关闭
BEGIN | START TRANSACTION;
标准事务语句
COMMIT | ROLLBACK;
示例演示如下,当开启事务后作出的操作如果不进行COMMIT
则操作全部失效:
START TRANSACTION;
INSERT INTO
userInfo(name, age, gender)
VALUES
("Jack", 18, "MALE"),
("Ken", 21, "MALE"),
("Keisha", 22, "FEMALE");
SELECT * FROM userInfo;
ROLLBACK;
SELECT * FROM userInfo;
全局事务
如果所有SQL
都使用事务操作,我们可以通过设置AUTOCOMMIT
的值关闭自动提交和开启全局事务机制,这样所有语句都是事务类型。
查看自动提交机制:
M > SHOW VARIABLES LIKE "AUTOCOMMIT";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
临时的在会话级别关闭自动提交机制,当前终端关闭后失效:
# 0关闭,1打开
SET AUTOCOMMIT = 0;
全局级别关闭自动提交机制,当前mysqld.service
服务重启后失效:
SET GLOBAL AUTOCOMMIT = 0;
永久生效,修改配置文件:
[mysqld]
AUTOCOMMIT = 0;
示例演示,现在我们并不需要进行START TRANSACTION...BEGIN
的操作也能开启事务:
SET AUTOCOMMIT = 0;
INSERT INTO
userInfo(name, age, gender)
VALUES
("Tom", 20, "MALE");
COMMIT;
隐式提交
以下语句的出现可能会触发隐式的COMMIT
:
# 1.连续使用BEGIN或者START TRANSACTION会触发COMMIT
BEGIN; -- 开启第一个事务
标准事务语句
BEGIN; -- 开启第二个事务,自动提交第一个事务
# 2.使用非事务语句会触发COMMIT
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)