当前位置:   article > 正文

MySql 事务

MySql 事务

事务ACID特性

事务:一组操作要么全部成功,要么全部失败,目的是为了保证数据的最终一致性。

原子性(Atomicity):当前的事务要么同时成功,要么同时失败。原子性由undo log日志来实现。(mysql undo log日志会在后台生成相应的对应数据日志,比如当执行insert语句时会undo log日志生成对于的delete语句,在事务执行失败回滚时会执行该语句。)
一致性(Consistency):使事务的最终目的,由其他3个特性以及业务代码正确逻辑来实现、
隔离性(Isolation):在事务并发执行时,他们的内部操作不能互相干扰。隔离性由mysql的各种锁以及MVCC机制来实现。
持久性(Durability):一旦提交了事务,他对事务的更改应该是永久性的,持久性由redo log日志实现。

事务隔离性

InnoDB引擎中,定义了4种隔离级别,级别越高事务隔离性越好,但性能就越低,而隔离性是由MYSQL的各种锁和MVCC机制来实现的。

  • read uncommit(读未提交):脏读
  • read commit(读已提交):不可重复读 语句级快照
  • repeatable read(可重复读):幻读 事务级快照
  • serializable(串行):解决上面所有问题,包括脏写
    更新丢失或者脏写:当两个或者多个事务选择同一行数据修改,有可能发生更新丢失,即最后更新覆盖了其他事务所作的更新。

脏读:事务A读到事务B已经修改但是没有提交的数据。
不可重复读:事务A内部的相同查询语句在不同时刻读出的结果不一致。
可重复读:事务A每次查询结果一致(在 repeatable read隔离级别下,当事务A进行第一次查询时,数据库生成一个快照,每次查询都是查询快照内容。若此时事务B开启事务进行查询,会生成新的事务B的数据库快照,此时事务A和事务B数据库快照数据可能不相同)。
幻读:事务A读到事务B提交的新增数据

select 查询读取快照读,update、insert、delete使用的是当前写
repeatable read隔离级别中:update之后,会跟新当前事务中关于该条记录的快照,其他记录快照不变;在当前事务中无法查询到另一事务的insert的记录,但是可以如果有其他事务对insert的记录进行update,update之后可以查询到,且当前事务可对该insert记录进行update;delete需要测试。

所以,read uncommit、read commit、repeatable read三种都可能出现更新丢失和脏写,可以通过数据库的update、insert、delete避免(例如update tableName set a = a+1 )。其中read commit还可以通过加版本号解决。

测试隔离级别的方法

set tx_isolation = 'serializable';
//set tx_isolation = 'read-uncommitted' or 'read committed' or 'repeatable-read' or 'serializable';
begin;
//sql语句 ... ... 
select * from account


commit;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/557016
推荐阅读
相关标签
  

闽ICP备14008679号