MySQL_基础_TCL事务控制语言

事务(ACID)的特性

原子性(Atomicity)    一个事务不可再分割,要么都执行要么都不执行
一致性(Consistency)  一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性(Isolation)    一个事务的执行不受其他事务的干扰
持久性(Durability)   一个事务一旦提交,则会永久的改变数据库的数据

事务的并发问题

脏读:读到未提交更新数据,就是读到另一个事务未提交数据,就是脏数据
不可重复读:对同一记录两次读取不一致,因为另一事务对该记录做了修改
幻读:对同一张表的两次查询不一致,因为另一事务插入了一条数据

事务的隔离级别

隔离级别                    脏读       不可重复读        幻读
未提交读(READ-UNCOMMITTED)   √            √            √
已提交读(READ-COMMITTED)     ×            √            √
可重复读(REPEATABLE-READ)    ×            ×            √
可串行化(SERIALIZABLE)       ×            ×            ×

Oracle 支持的 2 种事务隔离级别: READ-COMMITTED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ-COMMITTED
Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE-READ

查看隔离级别
SELECT @@[session.]tx_isolation;                        # 查看会话隔离级别
SELECT @@global.tx_isolation;                           # 查看全局隔离级别

设置隔离级别
SET [SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;     # 设置会话隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;        # 设置全局隔离级别

事务的使用

事务提交
    SET autocommit = 0;                                           # 关闭自动提交
    START TRANSACTION;                                            # 开启事务
    INSERT INTO user(username, password) VALUES ('张三', '123');    # 执行SQL1
    INSERT INTO user(username, password) VALUES ('李四', '456');    # 执行SQL2
    COMMIT;                                                       # 提交所有
    SET autocommit = 1;                                           # 开启自动提交

事务回滚
    1、回滚所有
    SET autocommit = 0;                                           # 关闭自动提交
    START TRANSACTION;                                            # 开启事务
    INSERT INTO user(username, password) VALUES ('张三', '123');    # 执行SQL1
    INSERT INTO user(username, password) VALUES ('李四', '456');    # 执行SQL2
    ROLLBACK;                                                     # 回滚所有
    SET autocommit = 1;                                           # 开启自动提交

    2、回滚至保存点
    SET autocommit = 0;                                           # 关闭自动提交
    START TRANSACTION;                                            # 开启事务
    INSERT INTO user(username, password) VALUES ('张三', '123');    # 执行SQL1
    SAVEPOINT a;                                                  # 设置保存点
    INSERT INTO user(username, password) VALUES ('李四', '456');    # 执行SQL2
    ROLLBACK TO a;                                                # 回滚至保存点
    SET autocommit = 1;                                           # 开启自动提交
原文地址:https://www.cnblogs.com/Small-music/p/9274339.html