事务有四个优点:原子性、隔离性、持久性 ACID、一致性
但是会出现死锁 innodb ,myisam不支持事务(但是可以实现伪事务,通过表锁实现)
事务本质上是使用【行级锁】实现(排他锁,共享锁)
begin; start transaction; 开启事务
commit ;//提交
rollback ; //回滚
我们还写一个代码
先开启事务做一个添加
1 2 |
start transaction; insert into count (name) values('ssss'); |
然后新开一个命令,查询这个表
1 |
select * from count |
这个查询无法获取新增的数据
这就是隔离性
如果我们把查询放到事务里就可以l啦
1 2 3 4 |
start transaction; insert into count (name) values('ssss'); select * from count; commit; //提交 |
事务 先记录日志
事务开启后,会数据写入到磁盘 就是持久性。
有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秒。
2.相同条件下:innodb_flush_log_at_trx_commit=1,插入50W行数据所花时间17分21.91秒;
3.相同条件下:innodb_flush_log_at_trx_commit=2,插入50W行数据所花时间1分0.35秒。