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

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

事务T1:更新一条数据

-->事务T2:读取事务T1更新的记录

事务T1:调用commit进行提交

此时事务T2读取到的数据是保存在数据库内存中的数据,称为脏数据,这个过程称为脏读。

2.幻读  -- 用同一的操作读取2次,得到的记录数不相同

事务T1:查询表中所有记录

-->事务T2:插入一条记录

-->事务T2:调用commit进行提交

事务T1:再次查询表中所有记录

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

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

事务T1:查询一条记录

-->事务T2:更新事务T1查询的记录

-->事务T2:调用commit进行提交

事务T1:再次查询上次的记录

此时事务T1对同一数据查询了两次,可得到的内容不同,称为不可重复读。

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

4.丢失更新(Lost Update)

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

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)。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值