MySql 学习记录Day01

MySQL的日志

日志可分为两种 物理日志 redo log和逻辑日志redo log

Redo Log记录的是数据页的物理变化,而不是SQL语句。

Redo Log文件是循环使用的,当一个文件写满后,会切换到下一个文件。比如如果四个空间,写满了零号空间,就会跳到一号空间,如此循环下去,直到三号空间被写满,就会跳到零号空间

逻辑日志binlog,每当执行一个SQL语句时,如果该语句对数据进行了修改,MySQL会将这个SQL语句记录到Binlog中。

当事务提交时,MySQL会确保Binlog已经被写入磁盘。也就是可以用两阶段提交,在下图中后三步可以使得redo log和redo log 保持同步 这样在恢复数据的时候不会因为两个日志不同步而导致恢复的时候数据库的数据和恢复之前不一样

事务隔离
事务就是要保证一组数据库操作,要么全部成功,要么全部失败
当数据库上有多个事务同时执行的时候,就可能出现脏读 dirty read )、不可重复读 non- repeatable read )、幻读 phantomread )的问题
脏读是指一个事务读取了另一个事务尚未提交的数据
  • 示例
    • 事务T1开始并更新了一行数据。
    • 事务T2开始并读取了这一行数据。
    • 事务T1回滚,撤销了对这一行数据的更新。
    • 此时,事务T2读取到了事务T1未提交的数据,这些数据是无效的。

不可重复读是指在一个事务内多次读取同一行数据时,由于其他事务对该行数据进行了修改并提交,导致读取结果不一致 

  • 示例
    • 事务T1开始并读取了一行数据。
    • 事务T2开始并更新了这一行数据,并提交。
    • 事务T1再次读取这一行数据,发现数据已经改变。

幻读是指在一个事务内多次执行相同的查询时,由于其他事务插入了新的行,导致查询结果集发生变化 

示例

  • 事务T1开始并查询表中满足某个条件的所有行。
  • 事务T2开始并插入了一行满足该条件的新数据,并提交。
  • 事务T1再次执行相同的查询,发现结果集中多了一行新数据

SQL标准的事务隔离级别读未提交(read uncommitted)、 读提交(read committed)、可重复读(repeatable read)和串行化(serializable

  • 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一 致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化,顾名思义是对于同一行记录,会加写锁会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
事务的启动方式
  1. 显式启动事务语句, begin start transaction。配套的提交语句是commit,回滚语句是 rollback
  2.  set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit rollback 语句,或者断开连接。
  3. 在SpringBoot里用@Transactional注解开启事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值