网站建设应解决的问题,哪些网站是同字形网页,中华住房与城乡建设厅网站,网站文章优化怎么做3.1-数据库事务什么是事务一系列有序的数据库操作#xff1a;要么全部成功要么全部回退到操作前的状态中间状态对其他连接不可见事务的基本操作#xff1a;基本操作 说明start transaction 开始事务commit 提交(全部完成)rollback 回滚(回到初始状态)-- 开启一个事务start tr…3.1-数据库事务什么是事务一系列有序的数据库操作要么全部成功要么全部回退到操作前的状态中间状态对其他连接不可见事务的基本操作基本操作 说明start transaction 开始事务commit 提交(全部完成)rollback 回滚(回到初始状态)-- 开启一个事务start transaction;-- 或者使用(非标准sql)begin;insert into t values (1, 1, 1);-- 事务结束插入成功commit;begin;insert into t values (2, 1, 1);insert into t values (3, 1, 1);insert into t values (4, 1, 1);-- 事务结束没有插入数据rollback;begin;insert into t values (1, 1, 1);savepoint a1;insert into t values (2, 1, 1);-- 回滚到指定的保存点rollback to a1;commit;1234567891011121314151617181920212223自动提交autocommit可以在session级别设置每个DML操作都自动提交DDL永远都是自动提交无法通过rollback回滚事务的四个基本属性(ACID)原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)事务的原子性包含在事务中的操作要么全部被执行要么都不执行中途数据库或应用发生异常未提交的事务都应该被回滚事务的一致性数据的正确性合理性完整性数据一致性应该符合应用需要规则余额不能是负数交易对象必须先有账号用户账号不能重复事务的结果需要满足数据的一致性约束事物的持久性提交完成的事务对数据库的影响必须是永久性的数据库异常不会丢失事务更新通常认为成功写入磁盘的数据即为持久化成功事务的持久化的实现数据文件持久化随机同步刷新(慢)事务日志持久化与实例恢复顺序同步刷新(快) - 事务日志随机异步刷新 - 磁盘事务日志 - 磁盘(实例恢复)事务的隔离性数据库事务在提交完成前中间的任何数据变化对其他的事务都是不可见的。数据库隔离现象隔离现象 描述脏读(Dirty Read) 事务B读到事务A尚未提交的数据变更不可重复读(NonRepeatable Read) 事务B读取前后两次读取一条记录之间该记录被事务A修改并提交于是事务B读到了不一样的结果幻读(Phantom Read) 事务B按条件匹配到了若干行记录并修改。但是由于修改过程中事务A新插入了符合条件记录导致B更新完成后发现仍有符合条件却未被更新的记录。数据库隔离等级隔离等级 脏读 不可重复读 幻读未提交读 可能 可能 可能已提交读 不可能 可能 可能可重复读 不可能 不可能 可能可串行化读 不可能 不可能 不可能MySQL的事务隔离级别InnoDB默认标记为可重复读InnoDB并不是标准定义上的课重复读InnoDB默认在可重复读的基础上避免幻读MySQL事务隔离级别设置可在global/session/下个事务级别分别进行设置建议使用Read committed(同Oracle)或者建议使用默认的Repeatable readset tx_isolation -- 设置隔离级别12事务与并发写某个正在更新的记录再提交或回滚前不能被其他事务同时更新事务回滚的实现回滚段(rollback segment)与数据前像3.2-存储引擎概述MySQL程序层次架构MySQL架构MySQL存储引擎有多种可选方案可插拔可修改存储引擎基于表选择使用何种存储引擎主要存储引擎存储引擎 常用度 支持事务InnoDB 主要推荐 是MyISAM 古老偶尔有用系统表 否MEMORY 偶尔临时表有用纯内存 否BLACKHOLE 不用来存放数据个别特殊用处 否TokuDB 新颖个别特殊场景有奇效 是Cluster 新颖分布式内存线上不要用 是InnoDB存储引擎索引组织表支持事务支持行级锁数据块缓存日志持久化稳定可靠性能好线上尽量使用InnoDBMyISAM存储引擎堆表不支持事务只维护索引缓存池表数据缓存交给操作系统锁粒度较大数据文件可以直接拷贝偶尔可能会用上不建议线上业务数据使用MWMORY存储引擎数据全内存存放无法持久化性能较高不支持事务适合偶尔作为临时表使用create temporary table tmp (id int) engine memory ;BLACKHOLE存储引擎数据不作任何存储利用MySQL Replicate充当日志服务器在MySQL Replicate环境中充当代理主TokuDB分形树存储结构支持事务行锁压缩效率较高适合大批量insert的场景MySQL Cluster多主分布式集群数据节点间冗余高可用支持事务设计上易于扩展面向未来线上慎用改变表的存储引擎alter table m ENGINEinnodb;3.3-InnoDB存储引擎InnoDB存储引擎体系架构InnoDBInnoDB相关的磁盘文件文件 名称 数量 位置系统表空间 ibdata1 一个实例一个 innodb_data_home_dir日志文件 ib_logfile0/1 一个实例两个(可配置) innodb_log_group_home_dir表定义文件 表名.frm 每张表一个 Schema目录下表数据文件 表名.ibd 如果innodb_file_per_table 1, 则每张表一个 Schema目录下InnoDB系统表空间文件ibdata1里存放了什么:回滚段所有InnoDB表元数据信息Double Write, Insert buffer dump等等….自动扩展机制InnoDB与磁盘文件有关的参数参数 样例值 备注innodb_data_home_dir /data/mysql/node_1 数据主目录innodb_log_group_home_dir /data/mysql/node_1 一般同上innodb_data_file_path ibdata1:512M:autoextned 请开启autoextnedinnodb_autoextend_increment 128 MB,勿太大或太小innodb_file_per_table 1 强烈建议开启innodb_log_file_size 100MB 性能相关innodb_log_files_in_group 2 性能相关InnoDB数据文件存储结构索引组织表(聚簇表)根据表逻辑主键排序数据节点每页16K根据主键寻址速度很快主键值递增的insert插入效率较好主键值随机insert插入效率差因此InnoDB表必须指定主键建议使用自增数字InnoDB数据块缓存池数据的读写需要经过缓存数据以整页(16K)为单位读取到缓存中缓存中的数据以LRU策略换出IO效率高性能好InnoDB Buffer Pool相关参数参数 样例值 备注innodb_buffer_pool_size 10G 根据总物理内存设置InnoDB数据持久化与事务日志事务日志实时持久化内存变化数据(脏数据)增量异步刷出到磁盘实例故障靠重放日志恢复性能好可靠恢复快InnoDB日志持久化相关参数参数 样例值 备注innodb_flush_log_at_trx_commit 1 可选0每隔1s写入并持久化一次日志。1每次commit都写入并持久化日志。2每次提交日志写到内存每1s持久化一次InnoDB行级锁写不阻塞读不同行间的写互相不阻塞并发性能好InnoDB与事务ACID事务ACID特性完整支持回滚段失败回滚支持主外键约束事务版本回滚段MVCC事务日志持久化默认可重复读隔离级别可以调整3.4-InnoDB事务锁什么是计算机程序锁计算机程序锁控制对共享资源进行并发访问保护数据的完整性和一致性数据库中的锁分为两个大类lock latch/mutex对象 事务保护 数据库逻辑内容持续时间 事务过程中我们主要关心的是事务锁数据库事务并发对同一行记录的修改必须串行化事务锁粒度行锁InnoDB, Oracle页锁SQL Server表锁MyISAM, Memory锁升级InnoDB存储引擎中的锁模式与粒度四种基本锁模式共享锁(S) - 读锁 - 行锁排他锁(X) - 写锁 - 行锁意向共享锁(IS) - 表级意向排他锁(IX) - 表级意向锁意向锁总是自动先加并且意向锁自动加自动释放意向锁提示数据库这个session将要在接下来施加何种锁意向锁和X/S锁级别不同除了阻塞全表级别的X/S锁外其他任何锁InnoDB锁模式互斥锁互斥数据库加锁操作一般的select语句不加任何锁也不会被任何事物锁阻塞读的隔离性由MVCC确保S锁手动select from tb_test lock in share mode;自动insert前X锁手动select from tb_test lock for update;自动updatedelete前InnoDB行锁的实现通过索引项加锁实现只有条件走索引才能实现行级锁索引上有重复值可能锁住多个记录查询有多个索引可以走可以对不同索引加锁是否对索引加锁实际上取决于MySQL执行计划自增主键做条件更新性能最好没有索引的话会对整张表加锁。InnoDB的gap lock什么是幻读gap lock消灭幻读InnoDB消灭幻读仅仅为了确保statement模式replicate的主从一致性小心gap lock自增主键做条件更新性能最好死锁什么是死锁A、B两个事务A先更新t1同时B更新t2A再更新t2B再更新t1就发生了死锁。死锁数据库自动解决数据库挑选冲突事务中回滚代价较小的事务回滚死锁预防单表死锁可以根据批量更新里的更新条件排序可能冲突的跨表事务尽量避免并发尽量缩短事务长度业务逻辑加锁业务流程中的悲观锁任何的并发修改都有可能造成我们的业务逻辑最终的错误在事务流程中一开始就加锁最后释放如何缩短锁的时间