爱射影院网站建设中,兰州网络公司排名,怎么建设分销模式手机网站,开发公司对物业公司的考核事务#xff1f; 1、事务的特性#xff1a;原子性、一致性、隔离性、持久性 #xff08;ACID#xff09; 2、多事务同时执行的时候#xff0c;可能会出现的问题#xff1a;脏读、不可重复读、幻读 3、事务隔离级别#xff1a;读未提交、读提交、可重复读、串行化 4、不… 事务 1、事务的特性原子性、一致性、隔离性、持久性 ACID 2、多事务同时执行的时候可能会出现的问题脏读、不可重复读、幻读 3、事务隔离级别读未提交、读提交、可重复读、串行化 4、不同事务隔离级别的区别 读未提交一个事务还未提交它所做的变更就可以被别的事务看到 读提交一个事务提交之后它所做的变更才可以被别的事务看到 可重复读一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的 串行化对应一个记录会加读写锁出现冲突的时候后访问的事务必须等前一个事务执行完成才能继续执行 更好理解 读未提交别人改数据的事务尚未提交我在我的事务中也能读到。 读已提交别人改数据的事务已经提交我在我的事务中才能读到。 可重复读别人改数据的事务已经提交我在我的事务中也不去读。 串行我的事务尚未提交别人就别想改数据。 5、配置隔离级别方法启动参数transaction-isolation 6、事务隔离的实现每条记录在更新的时候都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本这就是数据库的多版本并发控制MVCC。 7、回滚日志什么时候删除系统会判断当没有事务需要用到这些回滚日志的时候回滚日志会被删除。 8、什么时候不需要了当系统里么有比这个回滚日志更早的read-view的时候。 9、为什么尽量不要使用长事务。长事务意味着系统里面会存在很老的事务视图在这个事务提交之前回滚记录都要保留这会导致大量占用存储空间。除此之外长事务还占用锁资源可能会拖垮库。 10、事务启动方式一、显式启动事务语句begin或者start transaction,提交commit回滚rollback二、set autocommit0该命令会把这个线程的自动提交关掉。这样只要执行一个select语句事务就启动并不会自动提交直到主动执行commit或rollback或断开连接。 11、建议使用方法一如果考虑多一次begin交互问题可以使用commit work and chain语法。在autocommit1的情况下用begin显式启动事务如果执行commit则提交事务。如果执行commit work and chain则提交事务并自动启动下一个事务。 索引 1.索引的作用提高数据查询效率 2.常见索引模型哈希表、有序数组、搜索树 3.哈希表键 - 值(key - value)。 4.哈希思路把值放在数组里用一个哈希函数把key换算成一个确定的位置然后把value放在数组的这个位置 5.哈希冲突的处理办法链表 6.哈希表适用场景只有等值查询的场景 7.有序数组按顺序存储。查询用二分法就可以快速查询时间复杂度是O(log(N)) 8.有序数组查询效率高更新效率低 9.有序数组的适用场景静态存储引擎。 10.二叉搜索树每个节点的左儿子小于父节点父节点又小于右儿子 11.二叉搜索树查询时间复杂度O(log(N))更新时间复杂度O(log(N)) 12.数据库存储大多不适用二叉树因为树高过高会适用N叉树 13.InnoDB中的索引模型BTree
B树每个结点放的是索引记录占内存B树非叶子放的是索引叶子放的是索引记录innodb B树叶子结点都是用双向链表连起来的方便查询 14.索引类型主键索引、非主键索引 主键索引的叶子节点value存的是整行的数据(聚簇索引)非主键索引的叶子节点value是主键的值(二级索引) 15.主键索引和普通索引的区别主键索引只要搜索ID这个BTree即可拿到数据。普通索引先搜索索引拿到主键值再到主键索引树搜索一次(回表) 16.一个数据页满了按照BTree算法新增加一个数据页叫做页分裂会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并合并的过程是分裂过程的逆过程。 17.从性能和存储空间方面考量自增主键往往是更合理的选择。 tips 1、覆盖索引如果查询条件使用的是普通索引或是联合索引的最左原则字段查询结果是联合索引的字段或是主键不用回表操作直接返回结果减少IO磁盘读写读取正行数据2、最左前缀联合索引的最左 N 个字段也可以是字符串索引的最左 M 个字符3、联合索引根据创建联合索引的顺序以最左原则进行where检索比如agename以age1 或 age 1 and name‘张三’可以使用索引单以name‘张三’ 不会使用索引考虑到存储空间的问题还请根据业务需求将查找频繁的数据进行靠左创建索引。4、索引下推like hello%’and age 10 检索MySQL5.6版本之前会对匹配的数据进行回表查询。5.6版本后会先过滤掉age10的数据再进行回表查询减少回表率提升检索速度锁 根据加锁范围MySQL里面的锁可以分为全局锁、表级锁、行级锁一、全局锁 对整个数据库实例加锁。 MySQL提供加全局读锁的方法Flush tables with read lock(FTWRL) 这个命令可以使整个库处于只读状态。使用该命令之后数据更新语句、数据定义语句和更新类事务的提交语句等操作都会被阻塞。 使用场景全库逻辑备份。 风险 1.如果在主库备份在备份期间不能更新业务停摆 2.如果在从库备份备份期间不能执行主库同步的binlog导致主从延迟 官方自带的逻辑备份工具mysqldump当mysqldump使用参数--single-transaction的时候会启动一个事务确保拿到一致性视图。而由于MVCC的支持这个过程中数据是可以正常更新的。 一致性读是好但是前提是引擎要支持这个隔离级别。 如果要全库只读为什么不使用set global readonlytrue的方式 1.在有些系统中readonly的值会被用来做其他逻辑比如判断主备库。所以修改global变量的方式影响太大。 2.在异常处理机制上有差异。如果执行FTWRL命令之后由于客户端发生异常断开那么MySQL会自动释放这个全局锁整个库回到可以正常更新的状态。而将整个库设置为readonly之后如果客户端发生异常则数据库就会一直保持readonly状态这样会导致整个库长时间处于不可写状态风险较高。二、表级锁 MySQL里面表级锁有两种一种是表锁一种是元数据所(meta data lock,MDL) 表锁的语法是:lock tables ... read/write 可以用unlock tables主动释放锁也可以在客户端断开的时候自动释放。lock tables语法除了会限制别的线程的读写外也限定了本线程接下来的操作对象。 对于InnoDB这种支持行锁的引擎一般不使用lock tables命令来控制并发毕竟锁住整个表的影响面还是太大。 MDL不需要显式使用在访问一个表的时候会被自动加上。 MDL的作用保证读写的正确性。 在对一个表做增删改查操作的时候加MDL读锁当要对表做结构变更操作的时候加MDL写锁。 读锁之间不互斥。读写锁之间写锁之间是互斥的用来保证变更表结构操作的安全性。 MDL 会直到事务提交才会释放在做表结构变更的时候一定要小心不要导致锁住线上查询和更新。
三、行锁
两阶段锁在 InnoDB 事务中行锁是在需要的时候才加上的但并不是不需要了就立刻释放 而是要等到事务结束时才释放。 建议如果你的事务中需要锁多个行要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。 死锁当并发系统中不同线程出现循环资源依赖涉及的线程都在等待别的线程释放资源时就会导致这几个线程都进入无限等待的状态。 解决方案 1、通过参数 innodb_lock_wait_timeout 根据实际业务场景来设置超时时间InnoDB引擎默认值是50s。 2、发起死锁检测发现死锁后主动回滚死锁链条中的某一个事务让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on表示开启这个逻辑默认是开启状态。 如何解决热点行更新导致的性能问题 1、如果你能确保这个业务一定不会出现死锁可以临时把死锁检测关闭掉。一般不建议采用 2、控制并发度对应相同行的更新在进入引擎之前排队。这样在InnoDB内部就不会有大量的死锁检测工作了。 3、将热更新的行数据拆分成逻辑上的多行来减少锁冲突但是业务复杂度可能会大大提高。