事务
事务的隔离级别以及产生的问题
隔离级别
读未提交:指一个事务未提交时,他的变更能够被其他事务所读取到。
(脏读)
读已提交:指一个事务提交之后,别的事务才能看到他的变更。
(不可重复读)
可重复读:指一个事务执行过程中,数据总是和事务启动时的一致。
(幻读)
序列化:对同一行记录,读会加读锁,写会加写锁,后面的事务必须要等前面的事务执行完成才能执行。
mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);
各隔离级别所对应数据:
读未提交:V1=2,V2=2,V3=2
读已提交:V1=1,V2=2,V3=2
可重复读:V1=1,V2=1,V3=2
序列化:将1改成2时阻塞。
Oracle默认隔离级别是读已提交。
隔离级别的实现
MySQL每条更新记录都会同事记录一条回滚操作,假设一个值由1逐次递加到4,那么在这条记录上就包含多条回滚日志,回滚日志保存到没有事务需要时才会删除(MVCC)。
长事务意味着在这个事务提交之前,在他之后产生的所有回滚日志都要记录在内,导致占用大量空间。