【hibernate】数据库事务初探

对事务的知识进行一次梳理,解决自己似懂非懂的状态!
什么是事务?
比较官方的解释是:由一条或者多条sql组成的不可分割的工作单元!要是执行失败就都失败,要是成功就都成功!
举个栗子就是:你转钱给别人,分为以下几个步骤
1. 你的钱减少
2. 对方的钱增多
如果在1->2这个过程中 服务器崩了 执行就失败了 加上事务后,你的处理过程是一个整体,一处失败就都失败了,你的转钱操作就都失败了 ,整体成功才是真的成功!
事物的四大特性(ACID)
1.原子性:事务是最小单位了,不可分割的一个整体
2.一致性:事务完成时,必须使所有的数据保持一致的状态
3.隔离性:一个事务执行期间不能被另一个事务干扰到
4.持久性:事务提交后,数据发生的改变是永久的

然后就是 在并发时 ,因为有很多人访问数据库,就有可能发生以下的问题
1.脏读:一个事务读取到另一个事务未提交的数据!
脏读的例子:发工资了,财务给你打钱,发了5000元,但这时事务还没提交需要确认,你同时去查了账户发现是5000,然后财务发现,算错了,你只能发2000,然后一个回滚,你以为你有5000,实际上只有2000了!
2.不可重复读:一个事务读到了另一个事务update的数据,导致同一个事务多次查询结果不一样,
这个不可重复读举个例子 :你请哥们吃饭,然后去结账,你老婆同时在隔壁超市买东西,你账户就1000元,你和你老婆同时买,账户里双方都看到有1000元 你们刷卡,你老婆那边超市网速快,成功了 还先于你提交了事务,你再付款失败了,没钱了 !
3.幻读/虚读:一个事务读到了另一个事务insert的数据,导致同一个事务多次查询结果不一样,
举个例子:月末了,你老婆查账,发现你这个月才花了80很满意!你就没怎么花,结果查账的同时你付款买了一副新耳机,花了2000,等账单打印出来,发现账单2080????WTF???什么情况?幻觉?

为了解决上面这些问题,便有了数据库的隔离机制!
有以下几种隔离机制
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。
见下图
这里写图片描述
这里写图片描述

然后最后提一下
mysql 默认是 Repeatable read
oracle 默认是 Read committed

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值