a>. READ UNCOMMITTED(读未提交)
可以读取到别人没有提交的事物,又名“脏读”,因此这种方式数据安全性最差,但好处就是并发性最强。不能重复读(两次读取同一张表的内容可能不一致,也就是说,当不同的用户读取同一张表时,当某DBA对这张进行的删除表中的数据时,其他用户也能读取到删除的行即使别人还没有提交事物呢,而DBA回滚操作是,其他用户任然也可以看到回滚的内容,因此两次读取的内容是不一致的。),甚至会产生幻读(我们读取到的数据和真实数据不一致),因此这种模式用的相对较少。
b>.READ COMMITTED(读提交)
读提交指的是一个事物开始的时候只能看见已经提交事物的修改,其他未修改的事物这里通通都看不到,我们也可以说提交之后才能读,市面上常见的大多数关系型数据库隔离级别都是读提交,不过MySQL并不是。该模式存在幻读现象。对事物要求不特别严格的场景下,可以使用读提交。
c>.REPEATABLE READ (可重读)
可重读解决了脏读的问题,在最近的一个事物提交之前, 所有读到的事物都是一样的。因此,在同一事物中多次读同一数据的内容是一样的。但是仍然没有解决幻读的问题。mysql默认就是用的这种模式。该模式存在幻读现象。
d>.SERIALIZABLE(可串行化)
事物和事物之间严格进行隔离,只要涉及到同一个数据彼此之间是不能做任何交叠的,必须要等到其他人提交了或是把数据修改完成之后我们才能读取,通过强制事务的串行执行避免了幻读,但是性能极低。它的隔离界别极高,只有确保数据非常明确的情况下才能用到SERIALIZABLE。
e>,跟事物相关的常用命令
start transaction #启动事务
commit #事务提交
rollback #事务回顾
savepoint #控制回滚的位置
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
f>.自动提交事物
如果没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交。如果我们关闭了自动提交,那么我们就必须手动启动事物,然后手动进行提交。如果没有提交就会导致数据丢失哟!
g>.MVCC:多版本并发控制
每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照。为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间(里面存储的系统版本号[system version number])
MVCC只在两个隔离级别下有效,即:read committed(读提交)和repeatable read(可重读)