MySQL事务

目录

一、MySQL使用事务

二、自动提交策略

三、隐式提交语句

1、用于隐式提交的 SQL 语句:

2、导致提交的非事务语句:

3、导致隐式提交的语句示例:

四、开始事务流程

1、检查autocommit是否为关闭状态

2、开启事务,并结束事务

五、 InnoDB 事务的ACID保证

1、基本概念

2、redo log——重做日志

3、undo——回滚日志


一、MySQL使用事务

1、开启事务(begin)              

2、回滚事务(rollback)

        将内存中,已执行过的操作,回滚回去

3、提交事务(commit)

        完成一个事务,一旦事务提交成功 ,就说明具备ACID特性了。

二、自动提交策略

MySQL默认已经开启自动提交,我们可以通过对应的设置来开启或者关闭自动提交。

自动提交是否打开,一般在有事务需求的MySQL中,将其关闭
不管有没有事务需求,我们一般也都建议设置为0,可以很大程度上提高数据库性能

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global autocommit=0;
Query OK, 0 rows affected (0.00 sec)

三、隐式提交语句

1、用于隐式提交的 SQL 语句:

begin 
a
b
begin
SET AUTOCOMMIT = 1

2、导致提交的非事务语句:

        DDL语句: (ALTER、CREATE 和 DROP)
        DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
        锁定语句:(LOCK TABLES 和 UNLOCK TABLES)

3、导致隐式提交的语句示例:

        TRUNCATE TABLE
        LOAD DATA INFILE
        SELECT FOR UPDATE

四、开始事务流程

1、检查autocommit是否为关闭状态

select @@autocommit;
或者:
show variables like 'autocommit';

2、开启事务,并结束事务

begin
delete from student where name='alexsb';
update student set name='alexsb' where name='alex';
rollback;

begin
delete from student where name='alexsb';
update student set name='alexsb' where name='alex';
commit;

五、 InnoDB 事务的ACID保证

1、基本概念

redo log                 重做日志 ib_logfile0~1        50M        轮询使用

redo log buffer       redo内存区域

ibd                          存储 数据行和索引 

buffer pool              缓冲区池,数据和索引的缓冲

LSN : 日志序列号 

MySQL 每次数据库启动,都会比较磁盘数据页和redolog的LSN,必须要求两者LSN一致数据库才能正常启动

WAL——write ahead log 日志优先写的方式实现持久化

脏页——内存脏页,内存中发生了修改,没写入到磁盘之前,我们把内存页称之为脏页.

CKPT——Checkpoint,检查点,就是将脏页刷写到磁盘的动作

TXID——事务号,InnoDB会为每一个事务生成一个事务号,伴随着整个事务

2、redo log——重做日志

        作用——在事务ACID过程中,实现的是“D”持久化的作用。对于AC也有相应的作用

        日志位置——redo的日志文件:iblogfile0 iblogfile1

        reduo buffer        

                redo的buffer:数据页的变化信息+数据页当时的LSN号

                LSN:日志序列号  磁盘数据页、内存数据页、redo buffer、redolog

        刷新策略 —— commit;
                                刷新当前事务的redo buffer到磁盘
                                还会顺便将一部分redo buffer中没有提交的事务日志也刷新到磁盘

       

3、undo——回滚日志

        作用:

        在事务ACID过程中,实现的是“A” 原子性的作用
        另外CI也依赖于Undo
        在rolback时,将数据恢复到修改之前的状态
        在CSR实现的是,将redo当中记录的未提交的时候进行回滚.
        undo提供快照技术,保存事务修改之前的数据状态.保证了MVCC,隔离性,mysqldump的热备

对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含 3 个隐藏列

db_row_id:隐藏的行 ID。在没有自定义主键也没有 Unique 键的情况下,会使用该隐藏列作为主键。

db_trx_id:操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。

db_roll_ptr:回滚指针,也就是指向这个记录的 Undo Log 信息。Undo Log 中存储了回滚需要的数据

你可能感兴趣的:(DateBase,mysql,数据库,windows,sql)