较好的网站设计师培训学校,福州网站提升排名,网络广告包括,wordpress博客头图怎么改1. 什么是事务
事务就是一组数据库操作#xff0c;这些操作是一个atomic#xff08;原子性的操作#xff09; #xff0c;不可分割#xff0c;要么都执行#xff0c;要么回滚#xff08;rollback#xff09;都不执行。这样就避免了某个操作成功某个操作失败#xff0…1. 什么是事务
事务就是一组数据库操作这些操作是一个atomic原子性的操作 不可分割要么都执行要么回滚rollback都不执行。这样就避免了某个操作成功某个操作失败从而导致数据的不一致。
2. 事务的4大特性
原子性Atomicity一致性Consistency隔离性Isolation持久性Durabilily简称ACID。 事务的目标 一致性是事务的最终目的原子性、隔离性、持久性都是为了实现一致性。
2.1. 并发事务带来的问题 隔离性带来的问题
两个并发执行的事务如果涉及到操作同一条记录的时候可能会发生问题。因为并发操作会带来数据的不一致性包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别避免数据不一致的问题。 2.2. 事务隔离级别 解决隔离性带来的问题
事务的隔离性是有级别的在某些级别下在并发事务的情况下不能保证一个事务的执行不被其它事务干扰。既然会被干扰那么就会出现一些问题。 在MySQL中如果使用InnoDB默认的隔离级别是Repeatable Read。
3. 数据库日志
一、redo log 重做日志
内容物理格式的日志记录的是物理数据页面的修改的信息其redo log是顺序写入redo log file的物理文件中去的。 该日志文件主要由两部分组成重做日志缓冲redo log buffer和重做日志文件redo log前者存储在内存中后者存储在磁盘中。mysql 为了提升性能不会把每次的修改都实时同步到磁盘而是会先存到 Buffer Pool(缓冲池) 里头把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。
作用确保事务的持久性。防止在发生故障的时间点尚有脏页未写入磁盘在重启mysql服务的时候根据redo log进行重做从而达到事务的持久性这一特性。
二、undo log 回滚日志
内容逻辑格式的日志在执行undo的时候仅仅是将数据从逻辑上恢复至事务之前的状态而不是从物理页面上操作实现的这一点是不同于redo log的。
作用保存了事务发生之前的数据的一个版本可以用于回滚同时可以提供多版本并发控制下的读MVCC也即非锁定读。
三、bin log 归档日志二进制日志
内容逻辑格式的日志可以简单认为就是执行过的事务中的sql语句。 但又不完全是sql语句这么简单而是包括了执行的sql语句增删改反向的信息也就意味着delete对应着delete本身和其反向的insertupdate对应着update执行前后的版本的信息insert对应着delete和insert本身的信息。
作用用于复制在主从复制中从库利用主库上的binlog进行重播实现主从同步。 用于数据库的基于时间点的还原。
binlog 有三种模式Statement基于 SQL 语句的复制、Row基于行的复制 以及 Mixed混合模式
4. 如何实现事务
务的实现依靠的是innodb的redo log, undo log和锁。
4.1 原子性
原子性的实现主要依靠的是Undo log日志。原子性的体现主要是在sql在执行过程中发生错误而发生回滚上。回滚是要回到执行前的一个状态那么怎么回到执行前的状态呢我们是不是就得将执行前的状态记录下来。因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。
4.2 持久性
我们需要先来了解下InnoDB是怎么来读写数据的。我们知道数据库的数据都是存放在磁盘中的但是磁盘I/O的成本是很大的如果每次读写数据都要访问磁盘数据库的效率就会非常低。为了解决这个问题InnoDB提供了 Buffer Pool 作为访问数据库数据的缓冲。
Buffer Pool 是位于内存的包含了磁盘中部分数据页的映射。当需要读取数据时InnoDB会首先尝试从Buffer Pool中读取读取不到的话就会从磁盘读取后放入Buffer Pool当写入数据时会先写入Buffer Pool的页面并把这样的页面标记为dirty并放到专门的flush list上这些修改的数据页会在后续某个时刻被刷新到磁盘中这一过程称为刷脏由其他后台线程负责 。
通过前面的介绍我们知道InnoDB使用 Buffer Pool 来提高读写的性能。但是 Buffer Pool 是在内存的是易失性的如果一个事务提交了事务后MySQL突然宕机且此时Buffer Pool中修改的数据还没有刷新到磁盘中的话就会导致数据的丢失事务的持久性就无法保证。为了解决这个问题InnoDB引入了 redo log来实现数据修改的持久化。根据我们在上面所介绍的WAL机制先写日志再写磁盘有了redo logInnoDB就可以保证即使数据库发生异常重启之前提交的记录都不会丢失这个 能力称为crash-safe。
4.3 隔离性
数据库的隔离性就是通过加锁和MVCC来实现的。 可重复读的隔离级别会出现幻读的问题而MySQL的默认隔离级别是可重复读并且解决了幻读的问题。简单来说MySQL的默认隔离级别解决了脏读、幻读、不可重复读的问题。
数据库并发场景有三种 读-读不存在任何问题也不需要并发控制 读-写有线程安全问题可能会造成事务隔离性问题可能遇到脏读幻读不可重复读 写-写有线程安全问题可能存在更新丢失问题比如第一类更新丢失第二类更新丢失
写-写操作的线程安全是通过加锁来实现的但是加锁的操作会严重影响数据库的性能和并发量因此出现了MVCC—多版本并发控制。MVCC是一种用来解决读-写冲突的无锁并发控制MVCC在数据库中的实现就是为了解决读快照读写冲突它的实现原理主要是依赖记录中的 3个隐式字段undo日志 Read View 来实现的。MVCC可以为数据库解决以下问题
在并发读写数据库时可以做到在读操作时不用阻塞写操作写操作也不用阻塞读操作提高了数据库并发读写的性能同时还可以解决脏读幻读不可重复读等事务隔离问题但不能解决更新丢失问题
5. 总结
重做日志回滚日志以及锁技术就是实现事务的基础。
事务的 原子性 是通过 undo log 来实现的事务的 持久性 是通过 redo log 来实现的事务的 隔离性 是通过 (读写锁MVCC)来实现的事务的 一致性 是通过原子性持久性隔离性来共同实现的。
总之ACID只是个概念原子性持久性隔离性都是为了实现数据的一致性事务的最终目的就是要保障数据的一致性。