网站闭关保护怎么做,中国网信网,wordpress网站推翻重建,上海公司公开发行股票1.事务的ACID属性事务(Database Transaction) #xff0c;是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成#xff0c;否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元…1.事务的ACID属性事务(Database Transaction) 是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。原子性(atomic)事务必须是原子工作单元对于其数据修改要么全都执行要么全都不执行一致性(consistent)事务在完成时必须使所有的数据都保持一致状态。隔离性(insulation)由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。持久性(Duration)事务完成之后它对于系统的影响是永久性的。2.mysql更新丢失a.第一类丢失更新(lost update) 在完全未隔离事务的情况下两个事物更新同一条数据资源某一事物异常终止回滚造成第一个完成的更新也同时丢失。b.第二类丢失更新(second lost updates)是不可重复读的特殊情况如果两个事务都读取同一行然后两个都进行写操作并提交第一个事务所做的改变就会丢失。c.脏读(dirty read)如果第二个事务查询到第一个事务还未提交的更新数据形成脏读。d.幻读(phantom read)一个事务执行两次查询第二次结果集包含第一次中没有或者某些行已被删除造成两次结果不一致只是另一个事务在这两次查询中间插入或者删除了数据造成的。e.不可重复读(unrepeated read)一个事务两次读取同一行数据结果得到不同状态结果如中间正好另一个事务更新了该数据两次结果相异不可信任。3.事务的四种隔离等级按照安全性由高到低分别为a. Serializable 串行化b. Repeatable Read 可重复读c. Read Commited 可读已提交d. Read Uncommited 可读未提交隔离级别脏读不可重复读幻读第一类丢失更新第二类丢失更新READ UNCOMMITED允许允许允许不允许允许READ COMMITTED不允许允许允许不允许允许REPEATABLE READ不允许不允许允许不允许不允许SERIALIZABLE不允许不允许不允许不允许不允许4.悲观锁和乐观锁a.悲观锁大多数情况下依靠数据库的锁机制实现以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销特别是对长事务而言这样的开销往往无法承受。b.乐观锁为了避免悲观锁的性能问题大多是基于数据版本(Version)记录机制实现。何谓数据版本即为数据增加一个版本标识在基于数据库表的版本解决方案中一般是通过为数据库表增加一个version字段来实现。乐观锁的工作原理读取出数据时将此版本号一同读出之后更新时对此版本号加一。此时将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对如果提交的数据版本号大于数据库表当前版本号则予以更新否则认为是过期数据。5.innodb事务特性a.innodb能检测到死锁可能返回错误也可能将持有最少行级排他锁的事务进行回滚b.innodb存储引擎在修改表数据时使用事务日志用追加的方式保存修改记录将随机IO方式改为了顺序IO方式提高处理速度、c.事务默认采用自动提交如果不是显示开始一个事务则每个查询都被当做一个事务执行提交操作6.InnoDB的事务隔离等级以及如何解决幻读innodb引擎默认使用REPEATABLE READ(可重复读)隔离级别。该隔离级别还是会产生幻读问题。还需要使用next-key locking技术启动事务来避免幻读。具体实现是事务A针对非唯一索引查询时会使用排它锁 锁住索引前后两个范围其他事务无法在此范围内写入数据这样事务A多次查询的记录数都是一样的7.InnoDB存储引擎MVCC的实现策略MVCC将数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能.MVCC实现原理MVCC保存某个时间点上的数据快照。一个事务内看到的是同一个版本的快照数据一致。不同事务在同一时间点看到的数据会不一致因为他们得到的数据版本不一样。InnoDB在每行记录存在额外的隐藏字段其中一列存储行被更新的版本号,另外一列存储行被删除的版本号。每当一个事务开始的时候,innodb都会给这个事务分配一个递增的版本号,所以版本号也可以被认为是事务号.对于每一个”查询”语句,innodb都会把这个查询语句的版本号同这个查询语句遇到的行的版本号进行对比,然后结合不同的事务隔离等级,来决定是否返回该行。当隔离级别是REPEATABLE READ时这种策略下select、delete、 insert、 update语句如何操作1) SELECT:如果要查询的行被行锁锁定为了提高效率会去读取undo日志提高了效率。如果没有锁定呢根据条件查询出结果并过滤掉deleteVersion早于当前事务的行2) INSERT: 对新插入的行,行的更新版本被修改为该事务的事务号3) DELETE:对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除。innodb有一定规则来触发真正的删除操作4) UPDATE:在更新行的时候,innodb会把原来的行复制一份到undo段中,并把当前的事务号作为该行的创建版本(undo日志到底存的什么)在每一行数据中额外保存两个隐藏字段当前行创建时的版本号和删除时的版本号(可能为空)。每个事务又有自己的版本号这样事务内执行CRUD操作时就通过版本号的比较来达到数据版本控制的目的。具体做法见下面的示意图。MVCC缺点为了实现多版本InnoDB需要维护额外的隐藏字段以及清理不需要的行版本带来额外开销。