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)
posted @ 2021-02-22 11:21  云崖君  阅读(60)  评论(0编辑  收藏  举报