mysql事务

目录

**Innodb事务复合ACID特性:
**A:atomicity:原子性;
整个事务中所有操作要么全部执行成功,要么执行失败回滚到最初的状态;
C:consistency 一致性
数据库总是从一个一致性状态转化为另一个一致性状态。
I:isolation 隔离性
一个事务在提交之前所作出的操作是否能为其他事务可见,由于不同场景有不同的需求,所以针对隔离来说,有不同的隔离级别;
D:durability 持久性
事务一旦提交事务所做出的的修改将会永久保存,及时数据库崩溃,修改的数据也不会丢失。
事务中所有的sql语句都会被当做一个整体,要么全部执行成功,要么其中某些操作失败后回滚,回滚到最初的状态,可以将转账的sql语句写入到事务中,如下:
事务开始
update A用户余额为-1000
update B用户余额+1000
提交事务(事务结束)

事务日志可以分为redo log 和undo log

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/wd/2019/10/image-4.png@!full

redo log
redo log又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
使用redo log,能够实现ACID中的A,即原子性,即事务中的所有SQL会被当作一个执行单元。
redo log 由两部分组成,redo log buffer (重做日志缓冲)和redo log file(重做日志文件);
redo log buffer 存在于内存之中,是易失的,redo log bufrfer 是持久的,存在于磁盘上。
redo log file 是磁盘上的一段连续空间,通过innodb_flush_log_at_trx_commit参数来修改从redo log buffer 写入到redo log file的策略,
redo log 的参数
innodb_log_file_size:指定每个redo日志大小,默认值48MB
innodb_log_files_in_group:指定日志文件组中redo日志文件数量,默认为2
innodb_log_group_home_dir:指定日志文件组所在路劲,默认值./,指mysql的数据目录datadir
undo log
可以把undo log理解成数被修改前的备份,如果说事务进行了一半,有一条SQL没有执行 成功,那么数据库可以根据UNDO log进行撤销,将所有修改过的数据从罗就上恢复到修改之前的样子,比如,之前insert了1000条日志,那么就Delete 他们,undo log是逻辑日志,与redo log记录物理日志不同。
log group
log group为重做日志组,包含多个重做日志文件(Redo log file),当日志组中的第一个logfile被写满,则会开始将redo log写入日志组中的下一个重做日志文件中,依次类推,对所有文件进行写满时将覆盖第一个写入的日志文件,
事务日志参数:
查看如日志相关的配置参数:

> show global variable like '%innodb%log%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| innodb_encrypt_log                        | OFF        |
| innodb_flush_log_at_timeout               | 1          |
| innodb_flush_log_at_trx_commit            | 1          |
| innodb_locks_unsafe_for_binlog            | OFF        |
| innodb_log_arch_dir                       |            |
| innodb_log_arch_expire_sec                | 0          |
| innodb_log_archive                        | OFF        |
| innodb_log_block_size                     | 0          |
| innodb_log_buffer_size                    | 16777216   |
| innodb_log_checksum_algorithm             | DEPRECATED |
| innodb_log_checksums                      | ON         |
| innodb_log_compressed_pages               | ON         |
| innodb_log_file_size                      | 50331648   |
| innodb_log_files_in_group                 | 2          |
| innodb_log_group_home_dir                 | ./         |
| innodb_log_optimize_ddl                   | ON         |
| innodb_log_write_ahead_size               | 8192       |
| innodb_max_undo_log_size                  | 10485760   |
| innodb_mirrored_log_groups                | 0          |
| innodb_online_alter_log_max_size          | 134217728  |
| innodb_scrub_log                          | OFF        |
| innodb_scrub_log_speed                    | 256        |
| innodb_track_redo_log_now                 | OFF        |
| innodb_undo_log_truncate                  | OFF        |
| innodb_undo_logs                          | 128        |
| innodb_use_global_flush_log_at_trx_commit | OFF        |
+-------------------------------------------+------------
innodb_log_file_size表示每个redo log file的大小,单位为字节,上图表示重做日志为5M;
innodb_flush_log_at_trx_commiit 表示事务提交后是否立即将redo log从内存(log buffer)刷写到redo log file中, 0表示每秒中刷写一次,1为立即提交;2为先存放在缓存中,在写入到log file里;

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/wd/2019/10/image-5.png@!full

随机文章