六星教育 - java-mysql优化1909
什么是事务(ACID)?InnobDB是什么事务的四个特点事务的执行流程事务的日志事务io关系锁的作用锁的类型及特点原子性实现事务的生命周期事务重做与回滚日志文件解释事务详细流程事务会影响mysql的执行性能。
手动开启的事务不会自动回滚
什么是事务(ACID)?是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
InnobDB是什么InnoDB是MySQL默认的事务型引擎。除非有特别原因,否则应该优先考虑InnoDB引擎。
InnoDB的数据存储在表空间中,表空间由一系列数据文件组成。InnoDB可以将每个表的数据和索引放在单独文件中。
InnoDB采用MVCC来支持高并发,实现了四个标准隔离级别。默认基本是可重复读,并且提供间隙锁(next-key locks)策略防止幻读出现。
事务的四个特点原子性:对数据操作的时候要么一起通过要么一起失败
隔离性:在操作的数据这个事务没有执行完,其他程序无法操作这个数据
一致性:根据mysql规则,保证数据执行数量是一致
持久性:保存在磁盘中
事务的执行流程事务的日志事务io关系锁的作用当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性。
数据库锁出现的目的:处理并发问题
锁的类型及特点锁的特点:一旦数据被锁,这块锁的数据就不能操作了
在mysql中执行update、delete、insert、alter这些写的操作都会默认加上排他锁,不影响普通查询
mysql对sql的执行会默认加上事务
锁的机制:
1.表锁:Myisam,早起 BDB
锁住整个表
锁的实现开销小 ,开锁速度快
2.页锁:BDB
锁住某一个页的数据16Kb左右大小数据
折中
3.行锁:Innodb
锁住某一行数据
锁的实现更加复杂 开销大,加锁速度慢 查找数据定位的根据 索引定位
排他锁的特点:排他锁:不能允许读,也不能写 ,不能和其他锁一起使用
共享锁:可以允许读,但是不能写 可以与共享锁一起使用
排他锁:start transaction/begin select * from user where id=1 for update; COMMIT/ROLLBACK
共享锁:start transaction/begin select * from user where id=1 lock in share mode; COMMIT/ROLLBACK
如果数据被锁住会分配到一个小格子里,体现了事务与锁的隔离级别和安全性。格子里面的数据执行完,才能对其操作。
原子性实现重做日志 redo log => ib_logfile() 重新执行? 执行的是什么(数据恢复,中途出现异常或者服务断开,正常后恢复数据)
回滚日志 undo log =>ibdata 回滚数据
事务的生命周期mysql对于事务的执行:日志先行 须知:凡是执行的SQL都会执行事务
日志优先权 大于 实际操作的数据 所有执行的SQL都会先执行日志 在写数据
问题:加入日志写成功数据还没有到磁盘的时候mysql主机挂了???会不会数据丟失问题 (可能会)
1.执行commit后,mysql服务挂了,数据还没写到磁盘,mysql会执行redo日志写入数据
2.程序在开启事务后,提交事务之前,服务挂了,mmysql会执行undo日志回滚。
事务的声明周期:
insert into users (id, name) values (1, ’shineyork’);实际执行的SQL语句 undo 事务id,操作数据元素,操作前的数据,操作后的数据 delete from users where id = 1 redo 事务id, insert into users(id,name)values(1, 'shineyork');
查看事务id:
show engine innodb status /G;回滚曰志(主要在上图第②步:执行业务流程): 1. 手动执行回滚命令的时候会执行 2. 如果程序在开启事务之后,在提交事务之前发生了异常;在下一次mysql服务启动时候会执行 重做曰志(上图提交之后写入磁盘之前): 3.在mysql,事务执行了commit之后服务器挂了,但是数据还没有写入到磁盘,mysql在重启服务之后会 重新执行这个重做日志写入数据
事务详细流程