mysql事务

事务有四个优点:原子性、隔离性、持久性 ACID、一致性

但是会出现死锁 innodb ,myisam不支持事务(但是可以实现伪事务,通过表锁实现)

事务本质上是使用【行级锁】实现(排他锁,共享锁)

begin; start transaction; 开启事务

commit ;//提交

rollback ; //回滚

我们还写一个代码

先开启事务做一个添加

然后新开一个命令,查询这个表

这个查询无法获取新增的数据

这就是隔离性

如果我们把查询放到事务里就可以l啦

 

事务 先记录日志

事务开启后,会数据写入到磁盘  就是持久性。

有undo log 回滚撤销日志

有redo log 记录事务操作日志

日志有什么用呢?

当我们宕机了,再次重启后,他会重新执行事务操作,保证事务一致性。

shell

show innodb status  查看事务的日志

 

事务也会影响性能,因为事务会一直刷新写日志,但我们可以适当控制

innodb_flush_log_at_trx_commit   0   1 默认每隔一秒写入一次   2

默认1 :

0(延迟写): log_buff  –每隔1秒–> log_file  —实时—> disk                快、不安全
性能高,但是安全性差,突然宕机了,下一秒的数据还未写入磁盘,因为一秒刷新一次,后面的语句未写入还未执行。重启后无法获取
1(实时写,实时刷): log_buff  —实时—>  log_file  —实时—> disk   17秒    慢、安全
2(实时写,延迟刷): log_buff  —实时—> log_file –每隔1秒–> disk    折中
0:最快减少mysql写的等待   1:最大安全性,不会丢失数据  2:折中,减少操作系统文件写入等待时间
测试:
 1.相同条件下:innodb_flush_log_at_trx_commit=0,插入50W行数据所花时间25.08秒;
2.相同条件下:innodb_flush_log_at_trx_commit=1,插入50W行数据所花时间17分21.91秒;
3.相同条件下:innodb_flush_log_at_trx_commit=2,插入50W行数据所花时间1分0.35秒。

发表评论