hibernate-事务并发处理-21

事务acid

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

事务并发可能出问题

  • 第一类丢失更新(不支持事务的数据库才会出现)
    第一个事务:取钱事务
    第二个事务:存钱事务
    第一个事务查余额1000
    第二个事务查1000
    第二个事务存100,余额变为1100,第二个事务提交
    第一个事务取100,余额变为900
    第一个事务撤销(断电等)
    余额变为1000
    (第二个事务的钱没存上)

  • 脏读(读了别的事物没有提交的数据)
    dirty read 重点看
    第二个事务存100,余额变为1100
    第一个事务查余额为1100(读取脏数据)
    第二个事务回滚
    第一个事务取款1100
    第一个事务取款失败

  • 不可重复读(同一个事务前后读出来的数据不一样)
    nonrepeatable read 重点看
    第一个事务查余额1000
    第二个事务存100,余额变为1100,提交事务
    第一个事务查余额1100
    提交事务

  • 第二类丢失更新(不可重复读的特殊情况)
  • 幻读(它重点说的是插入和删除,另外一个事务插入或删除新数据)phantom problem 重点看
    第一个事务: 查询学生事务
    第二个事务:插入新学生事务
    第一个事务查询学生为10人
    第二个事务插入一个学生
    第一个事务查询学生为11人
    第二个事务提交
    第一个事务提交(由于第二个事务的影响,前后多了一个人)

数据库的事务隔离机制

1.java.sql.Connection
2.事务的4种隔离级别
a. read-uncommited(可以读没有提交的数据)
限制不了脏读、不可重复读、幻读
b. read-commited
不会出现脏读、但可能出现不可重复读、幻读
c.repeatable-read
给数据上加把锁,即不让其他的事务改这个数据
d.serialzable
即拒绝并发,但效率最低

一般情况下数据库会设置read-commited,因为综合的性能比较好,然后代码尝试解决不可重复读、幻读的问题

事务级别越高, 效率越低
mysql支持4种:默认的是repeatable-read重点看
oracle支持2种:默认是read-commited

3.hibernate中也是有4种事务隔离级别
可通过参数设定
1、2、4、8 如果不设置,依赖数据库的默认

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值