网站首页 文章专栏 mysql :事务
mysql :事务
编辑时间:2020-08-01 22:22 作者:小铨 浏览量:76

事务

1.mysql :事务

innodb支持事务:本质上是通过行级锁实现(排他锁,共享锁)
mysiam不支持事务:但是可以用伪事务->通过表锁
四大特点(ACID)
1.原子性(A)
  对于数据修改,要么全部都执行,要么全都不执行。
2.隔离性(C)
  在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程。
3.一致性(I)
  事务发生前和发生后,根据数据的规则,总额应该匹配。
4.持久性(D)
  事务一旦被提交,其结果就是永久性的,系统崩溃也不会影响
基础语法:

start transaction; 开启事务
insert into count (prefix,count,historyCount)values('dyi', 0, 2);
select * from count
commit;
到现在为止我们了解了 MySQL 中的两种日志:
回滚日志(undo log)和重做日志(redo log);
在数据库系统中,事务的原子性和持久性是由事务日志(transaction log)保证的,在实现时也就是上面提到的两种日志,前者用于对事务的影响进行撤销,后者在错误处理时对已经提交的事务进行重做,它们能保证两点:
发生错误或者需要回滚的事务能够成功回滚(原子性);
在事务提交后,数据没来得及写会磁盘就宕机时,在下次重新启动后能够成功恢复数据(持久性)



MySQL在进行事务处理的时候使用的是日志现行的方式来保证事务可快速和持久运行的,也就是在写数据库前,需要先写日志。当开始一个事务时,会记录该事物的一个LSN日志序列号;当执行事务时,会往InnoDB_Log_Buffer 日志缓冲区里插入事务日志(redo log);当事务提交时,会将日志缓存区里的事务日志刷入磁盘。这个动作主要是由innodb_flush_log_at_trx_commit这个参数控制的。

发出commit动作时。已经说明过,commit发出后是否刷日志由变量 innodb_flush_log_at_trx_commit 控制。
每秒刷一次。这个刷日志的频率由变量 innodb_flush_log_at_timeout 值决定,默认是1秒。要注意,这个刷日志频率和commit动作无关。0:分步的写入;1:实时写入;2:介于0和1之间。
当log buffer中已经使用的内存超过一半时。
当有checkpoint时,checkpoint在一定程度上代表了刷到磁盘时日志所处的LSN位置。
可以通过命令

show engine innodb status\G;
Log sequence number 8619676075 (表示当前的LSN日志序列号)

Log flushed up to 8619676075 (表示刷新到事物日志的LSN日志序列号)

Last checkpoint at 8619676075 (表示刷新到磁盘的LSN日志序列号)

除了记录事务日志意外,数据库还会记录一定量的撤销日志(undo log), undo与redo正好相反,在对数据进行修改时,由于某种原因失败了,或者人为执行了rollback回滚语句,就可以利用这些撤销日志将数据回滚到修改之前的样子。redo日志保存在ib_logfile0/1/2里,而undo日志保存在ibdata1里,在MySQL5.6里还可以把undo日志单拆分出去。



    出自:铨程互动

    地址:www.wuhequan.cn

    转载请注明出处!


来说两句吧
最新评论
0.072975s