湖南营销型网站建设 要上磐石网络,装潢设计属于什么专业类别,网站推广网,2024年新闻时事热点论文什么是事务
事务是由数据库中一系列的访问和更新组成的逻辑执行单元
事务的逻辑单元中可以是一条SQL语句#xff0c;也可以是一段SQL逻辑#xff0c;这段逻辑要么全部执行成功#xff0c;要么全部执行失败
举个最常见的例子#xff0c;你早上出去买早餐#xff0c;支付…什么是事务
事务是由数据库中一系列的访问和更新组成的逻辑执行单元
事务的逻辑单元中可以是一条SQL语句也可以是一段SQL逻辑这段逻辑要么全部执行成功要么全部执行失败
举个最常见的例子你早上出去买早餐支付宝扫码付款给早餐老板这就是一个简单的转账过程会包含两步
从你的支付宝账户扣款10元 早餐老板的账户增加10元
这两步其中任何一部出现问题都会导致整个账务出现问题
假如你的支付宝账户扣款10元失败早餐老板的账户增加成功那你就Happy了相当于马云请你吃早餐了O(∩_∩)O哈哈~
假如你的支付宝账户扣款10元成功早餐老板的账户增加失败那你就悲剧了早餐老板不会放过你会让你重新付款相当于你请马云吃早餐了-_-?
事务就是用来保证一系列操作的原子性上述两步操作要么全部执行成功要么全部执行失败
数据库为了保证事务的原子性和持久性引入了redo log和undo log
redo log
redo log是重做日志通常是物理日志记录的是物理数据页的修改它用来恢复提交后的物理数据页
如上图所示redo log分为两部分
内存中的redo log Buffer是日志缓冲区这部分数据是容易丢失的 磁盘上的redo log file是日志文件这部分数据已经持久化到磁盘不容易丢失
SQL操作数据库之前会先记录重做日志为了保证效率会先写到日志缓冲区中redo log Buffer再通过缓冲区写到磁盘文件中进行持久化既然有缓冲区说明数据不是实时写到redo log file中的那么假如redo log写到缓冲区后此时服务器断电了那redo log岂不是会丢失
在MySQL中可以自已控制log buffer刷新到log file中的频率通过innodb_flush_log_at_trx_commit参数可以设置事务提交时log buffer如何保存到log file中innodb_flush_log_at_trx_commit参数有3个值(0、1、2)表示三种不同的方式
为1表示事务每次提交都会将log buffer写入到os buffer并调用操作系统的fsync()方法将日志写入log file这种方式的好处是就算MySQL崩溃也不会丢数据redo log file保存了所有已提交事务的日志MySQL重新启动后会通过redo log file进行恢复。但这种方式每次提交事务都会写入磁盘IO性能较差 为0表示事务提交时不会将log buffer写入到os buffer中而是每秒写入os buffer然后调用fsync()方法将日志写入log file这种方式在MySQL系统崩溃时会丢失大约1秒钟的数据 为2表示事务每次提交仅将log buffer写入到os buffer中然后每秒调用fsync()方法将日志写入log file这种方式在MySQL崩溃时也会丢失大约1秒钟的数据
undo log
undo log是回滚日志用来回滚行记录到某个版本undo log一般是逻辑日志根据行的数据变化进行记录
undo log跟redo log一样也是在SQL操作数据之前记录的也就是SQL操作先记录日志再进行操作数据 总结一下
MySQL中是如何实现事务提交和回滚的
为了保证数据的持久性数据库在执行SQL操作数据之前会先记录redo log和undo log
redo log是重做日志通常是物理日志记录的是物理数据页的修改它用来恢复提交后的物理数据页
undo log是回滚日志用来回滚行记录到某个版本undo log一般是逻辑日志根据行的数据变化进行记录
redo/undo log都是写先写到日志缓冲区再通过缓冲区写到磁盘日志文件中进行持久化保存
undo日志还有一个用途就是用来控制数据的多版本MVCC
简单理解就是
redo log是用来恢复数据的用于保障已提交事务的持久性
undo log是用来回滚事务的用于保障未提交事务的原子性