[Js-SQL]事务的四个隔离级别

事务的四个隔离级别(4个):

  -read uncommitted  读未提交

  -read committed  读已提交

  -repeatable read  可重复读

  -serializable  串行化

read uncommitted 读未提交

  事务A和事务B,事务A未提交的数据,事务B可以读取到,这里读到的数据可以被称为“脏读”,最低的隔离级别,这种级别一般是理论存在,数据库默认的隔离级别一般都是高于该级别的

read committed 读已提交

  事务A和事务B,事务A提交的数据,事务B才能读取到。这种隔离级别高于上面的读未提交,意思是:对方事务提交之后的数据,我当前事务才能够读取到。这种隔离级别可以避免脏数据,这种隔离级别会导致“不可重复读”。这是Oracle默认的隔离级别

  假设事务1读取了一条记录(select user_name from user where user_id = 1),得到user_name = '456',事务1暂时没提交。事务2更新了一条记录(update user set user_name = '123' where user_id = 1),事务2提交。此时事务1再次select user_name from user where user_id = 1得到了user_name = '123',这样就导致事务1在读取同一行数据却得到不同的user_name。这就是所谓的不可以重复读

repeatable read 可重复读

   事务A和事务B,事务A提交之后的数据,事务B读取不到。事务B是可重复读取数据的,这种隔离级别高于读已提交,意思是:对方提交之后的数据我还是读取不到。这种隔离级别可以避免“不可重复读取”,达到可重复读取,但是会导致“幻读”。这是MySQL默认的隔离级别

  这个跟不可重复读相反,当事务1查询到user_name='456'时,事务2将user_name更新成'123'并提交,事务1再次查询还是会发现user_name='456',这样保证了可重复读。幻读的话就是当事务2插入一条新的数据id为2并提交,事务1由于可重复读的性质,只能在表中查到id为1的数据,如果此时事务1插入id为2的数据则会产生错误,因为此时表中已经有了id为2的数据,但是事务1只看到了id为1的数据。

serializable 串行化

  穿行排队等待

posted @ 2018-03-17 15:04  Js_zero  阅读(635)  评论(0编辑  收藏  举报