事物的四大特性? ACID 1.原子性 atomicity 一个事物是一个不可分割的工作单位,其中的操作,要么都做,要么不做。不存在中间状态。 2.一致性 consisitency 事物执行的前后,数据必须处于一种合法的状态。(可以自己定义 ,保持数据的一致性。) 3.隔离性 lsolation 多个事物并发执行的时候,事物内部的操作与其他事物是隔离的,并发执行,互不干扰。 4.持久性 Durability 事物一旦提交,对数据库的改变是永久性的。不受任何影响。 四大特性的实现原理? 1.mysql如何保证一致性的? 两个层面。 /* 1.数据库 通过原子性, 持久性,隔离性,来保证一致性。 AID 三大特性,是前提。 2.应用层面 通过代码判断数据库数据是否有效,然后再决定是回滚还是提交数据。 */ 2.mysql怎怎么保证原子性的? /* 1.利用innodb的undo log。 叫做回滚的日志 当事务回滚的时候,能够撤销所有已经成功执行的SQL语句,需要记录你要回滚的响应日志 2.举例说明 当你update一条数据,需要记录之前的旧值,回滚的时候,根据旧值进行update操作。 undo log 记录了这些回滚需要的信息,当事务执行失败,就可以以利undo log 中的信息 将数据回滚到修改之前的样子。 */ 3.mysql怎么保持久性的? /* 1. 是利用innodb 的 redo log。、 mysql把磁盘上的数据加载到内存中,在内存中对数据进行修改,在刷回磁盘上。 此时宕机,内存中的数据就会丢失。 2.如何避免宕机? 在事物提交之前将数据写入磁盘中。--------【引发的问题。】》只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了 毕竟一个事务里的SQL可能牵涉到多个数据页的修改,而这些数据页可能不是相邻的, 也就是属于随机IO。显然操作随机IO,速度会比较慢。 3.采用redo log? 做数据修改的时候,不仅在内村中操作,还会在redo log 中记录这次操作, 提交事物的时候,会将redo log 日志进行刷盘 redo log 一部分在内存中,一部分在磁盘上。 数据库宕机重启,就将redo log中的内容恢复到数据库中,再根据undo log 和binlog 内容决定 回滚还是提交数据。 4.好处? redo log 体积小,只记录了那一页修改了什么,体积小,刷盘快。 一直往末尾进行追加,属于顺序io.效率比随机io来快。 */ 4.mysql怎么保证隔离性的。 /* 利用锁 和mvcc 机制。 MVCC,即多版本并发控制(Multi Version Concurrency Control), 一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。 如果一个事务读取的行正在做DELELE或者UPDATE操作, 读取操作不会等行上的锁释放,而是读取该行的快照版本。 在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据, 是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。 */