脏读、幻读、不可重复读和丢失更新

1.脏读 -- 一个事务读取到另一个事务没有提交的数据数据库

事务T1:更新一条数据
          -->事务T2:读取事务T1更新的记录
 事务T1:调用commit进行提交
 此时事务T2读取到的数据是保存在数据库内存中的数据,称为脏数据,这个过程称为脏读。spa

2.幻读  -- 用同一的操做读取2次,获得的记录数不相同接口

事务T1:查询表中全部记录
          -->事务T2:插入一条记录
          -->事务T2:调用commit进行提交
事务T1:再次查询表中全部记录事务

注意:幻读重点在新增或删除。内存

3.不可重复读 -- 在同一事务中,2次读取同一数据,获得内容不一样it

事务T1:查询一条记录
         -->事务T2:更新事务T1查询的记录
         -->事务T2:调用commit进行提交
事务T1:再次查询上次的记录
此时事务T1对同一数据查询了两次,可获得的内容不一样,称为不可重复读。io

注意:不可重复读重点在修改。效率

4.丢失更新(Lost Update) 

事务T1读取了数据,并执行了一些操做,而后更新数据。事务T2也作相同的事,则T1和T2更新数据时可能会覆盖对方的更新,从而引发错误。date

5.处理以上隔离级别的问题,采用以下方法:方法

  事务隔离五种级别:
        (1)TRANSACTION_NONE  不使用事务。
        (2)TRANSACTION_READ_UNCOMMITTED  容许脏读。
        (3)TRANSACTION_READ_COMMITTED  防止脏读,最经常使用的隔离级别,而且是大多数数据库的默认隔离级别。
        (4)TRANSACTION_REPEATABLE_READ  能够防止脏读和不可重复读。
        (5)TRANSACTION_SERIALIZABLE  能够防止脏读,不可重复读取和幻读,(事务串行化)会下降数据库的效率。

  以上的五个事务隔离级别都是在Connection接口中定义的静态常量,使用setTransactionIsolation(int level) 方法能够设置事务隔离级别。

  如:con.setTransactionIsolation(Connection.REPEATABLE_READ)。

  注意:事务的隔离级别受数据库的限制,不一样的数据库支持的的隔离级别不必定相同。

相关文章
相关标签/搜索