事务
事务具有4个特性:
原子性:事务中所有操作视为一个原子,要么完全提交,要么完全回滚
一致性:事务在完成时,使所有数据从一种一致性状态变更为另外一种一致性状态
隔离性:事务与事务隔离,进行事务查看数据所处的状态,要么是被另一个并发事务修改前,要么修改后,通过锁机制实现
持久性:事务完成后,所做修改对数据的影响是永久的,即使系统重启或出现故障扔可恢复
InnoDB支持事务,引入了UNDO日志和REDO日志
REDO日志:事务执行时需要将执行的事务日志写入到日志文件里,即REDO日志,当每条SQL进行数据库更新操作时,首先将REDO日志写入到缓冲区,当客户端执行COMMIT提交时,日志缓冲区的内容被刷新到磁盘
UNDO日志:与REDO日志想法,UNDO日志主要用于事务异常时的数据回滚,就是复制事务前的数据库内容到UNDO缓冲区,然后在合适的时间内将内容刷新到磁盘,与REDO不同,磁盘上不存在单独的UNDO文件,UNDO被放在表空间对应的.ibd数据文件中
UNDO保证了事务的原子性
REDO保证事务的持久性
数据不需要在事务提交前写入磁盘,而是缓存在内存中
事务控制语句:
开启事务:BEGIN;
事务过程: UPDATE....
提交事务:COMMIT;
MYSQL事务隔离级别:4种
设置语句:SET GLOBAL TRANSACTION ISOLATION LEVEL 未提交读(READ UNCOMMITTED)|提交读(READ COMMITTED)|可重复读(REPEATABLE READ)|可串行化(SERIALIZABLE)
未提交读:可能脏读、不可重复读、幻读
提交读:可能不可重复读、幻读
(默认隔离级别)可重复读:可能幻读
可串行化:事务隔离最高级别,通过强制事务排序,使之不可能冲突,解决幻读问题,通过对每个读的数据行上加锁实现
脏读:事务B读取了事务A未提交的数据
不可重复读:事务A读取了数据,事务B更新并提交了数据,事务A在此读取数据,在一个事务中前后两次读取的结果并不致,导致了不可重复读
幻读:幻读的重点在于新增或者删除,其他类似不可重复读