一、不考虑隔离性会产生的三个问题

1、 脏读:

   一个事务处理过程中读取另一个未提交的事务中的数据

2、 不可重复读:

   一个事务两次读取同一行数据,结果不同状态的结果,中间正好
    另一个事务更新了该数据,两次结果相异,不可被信任。

    事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,
    事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

3、 幻读:

   一个事务执行两次查询,第二次结果集包含第一次中没有或某行已经被删除
    的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。

    例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,
    会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读

解决办法:四种隔离级别

1.Read Uncommitted(读取未提交内容)

    读未提交,一个事务可以读取另一个未提交事务的数据,但是读未提交产生了脏读,采用读提交可以解决脏读问题

2.Read Committed(读取提交内容)

    读提交,一个事务等待另一个事务提交后才能读取数据。读提交,若有事务对数据进行更新(update)操作时,
    读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。

3.Repeatable Read(重复读)

    重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。重复读可以解决不可重复读问题。
    不可重复读对应的是修改,即update操作。但是可能还会有幻读问题。幻读问题对应的是插入insert操作。

4.Serializable(可串行化)

    Serializable是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。
    凡是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

注意:

1.大多数数据库默认的事务隔离级别是Read committed

    ,如Sql Server。Oracle,Mysql的默认隔离级别是Repeatable read

2.隔离级别的设置只对当前连接有效。

    对于使用Mysql命令窗口而言,一个窗口就相当于一个连接,当前窗口设置的隔离级别只对当前窗口中
    的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对Connection
    对象有效,与其他链接Connection对象无关。

3.设置数据库的隔离级别一定要是在开启事务之前。

mybatis中的事务:
它是通过sqlSession对象的commit方法和rollback方法实现事务的提交和回滚。

查看当前事务隔离级别

:select @@transaction_isolation;;

设置当前会话的事务隔离级别: set session transaction isolation level XXX(隔离级别)

设置当前全局的事务隔离级别: set global transaction isolation level XXX(隔离级别)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐