MySQL并行问题与隔离级别
一、并行事务会有什么问题?
脏读(dirty read),脏读是指在一个事务中读取了另一个事务还未提交的数据变更,如果这个事务最终被回滚,那么之前读取的数据就是无效的或者说“脏”的。例如,事务A读取了事务B正在修改但还未提交的数据,然后事务B回滚,此时事务A获取的数据就是错误的。
不可重复读(non-repeatable read),不可重复读是指在一个事务内,同一查询在同一时刻多次执行却返回了不同的结果,这是因为在两次查询期间,其他事务对数据进行了修改并提交。比如,事务A首先查询了一条记录,之后事务B更新了这条记录并提交,当事务A再次查询这条记录时,发现其内容发生了变化,这就是不可重复读。
幻读(phantom read),幻读是在事务内多次执行同样的查询语句,但每次返回的结果集不同,即使查询条件保持不变。这种情况发生在查询结果集中新增或者删除了符合查询条件的行,原因是其他事务在该事务执行期间插入或删除了数据并提交。例如,事务A执行了一个范围查询并获取了一定数量的行,接着事务B插入了一条新数据且满足事务A的查询条件并提交,这时事务A再次执行相同的范围查询,会发现多出了原本不存在的数据行,这就像是出现了“幻影”一样的数据,因此被称为幻读。
二、事务隔离级别
读未提交(READ UNCOMMITTED),指一个事务还没提交,它做的修改就能被其他事务看到。
读提交(READ COMMITTED),一个事务做的修改,只有提交之后,其他事务才能看到。
可重复读(REPEATABLE READ),在整个事务过程中看到的数据,自始至终都是一致的。
串行化(SERIALIZABLE),每个读写操作都会加锁,多个事务要访问同一条记录时,必须要进行排队,优先级低的事务必须等优先级高的事务完成以后才能进行。

浙公网安备 33010602011771号