数据库的事务详解

14 篇文章 0 订阅
1 篇文章 0 订阅

这几天一直在看一个大神的博客,感觉更系统的学到了很多东西,按捺不住就写了这一篇总结,以防止以后忘记,也分享给大家。

今天写的是事务

初学时实在是不明白事务是什么东西,对这个印象十分的模糊,其实事务就是一组逻辑操作,大白话就是几个动作,以银行转钱为例子,假设A要给B转100元,那事务就是A在ATM机上从账户减掉了100元,然后B在ATM机上得到了100元,这俩个事情称为一个事务。

而我们在对数据库进行操作时数据库的数据的增删改都要事务的管理才可以保持数据的安全,这里的数据安全其实就是数据不会出现混乱的情况,那为什么事务就可以保持数据的安全呢?

原因在于事务的几个特性:

1.原子性:事务虽然看起来是有几个操作构成,但是在数据库看来它就是一个在小的工作单元,这个工作单元内的事情要么都成功要么都失败。

2.一致性:事务里的几个操作要保持同步,意思就是当A给B转钱时,A减少了100元,B只能增加100元,不会增加99元,或者101元。

3隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4持久性:事务一旦提交就是永久的改变了。就是说A给B转了100元,当A按确认时,A的账户中就会永久的少了100元,除非他在此充值,但是对于之前的操作来说它是永久改变了。

这是事务的几个特性,我们主要来看事务的隔离性(刚刚没说清楚)

事务的隔离性:当我们的项目真正上线之后,操作的人可能会有很多,对同一条数据可能就会产生了并发的操作现象,而这种现象会随着事务的隔离级别而出现很多问题。

首先了解事务的几个隔离级别:

1.读未提交  2.读已提交  3.可重复读  4.串行化

其实隔离级别是为了解决具体出现的问题而产生的,所以我们结合具体的出现的问题来解释隔离级别:

1.脏读:表现为当A改变了数据但是事务还没有提交,此时B来查询此条数据居然查到了A还没有提交的数据。

2.不可重复读:这个问题在之前我一直没有理解,知道看到了大神的博文之后才真正理解了,这个问题它可以是问题也可以不是问题,原因是不同的业务需求导致的。

先理解这个错误的表现:在一个事务内读取表中的某一行数据,多次读取结果不相同。

我们还是以AB作为例子:

当B想要查询A是不是给自己转钱了,然后B查了ATM机发现A还没有给自己转钱,然后B打电话给A,A接到电话之后立刻给B转了钱,此时B再次查询发现A果然给自己转了钱,这种情况下在B这一次事务中俩次查询同一数据,出现了不同的结果,这个业务下完全没有问题。
在举一个有问题的例子:

小李入职新公司对奖金不太了解。于是查了一下公司的个人账号,发现奖金只有1000元,和自己面试时所述的不一样,所以小李打电话问了人事,人事说不可能会出现这种情况,于是让小李再次查一下作为凭证,小李再次查询发现奖金居然变为是10000元了,原来在这中间财务部门发现,奖金统计错了,所以给小李改了过来。

3.幻读:这个错误和不可重复读是类似的,甚至可以这么理解幻读和不可重复读,其实就是一回事,只不过原因的表现形式不一样而已,幻读的结果也是同一事物中俩次读取不一样,只不过不可重复的是由于修改之前的数据,而幻读是插入或者删除数据而导致俩次结果不一致。

例子:

当某公司要发奖金,规定只有在今天之前入职的员工才有奖金,当财务统计时数据库给财务这个用户一个事务,财务统计时发现第一次导出的数据被同事弄丢了,于是他再次从数据库中导出数据,而在这中间人事给一个今天来的新员工办理入职,然后财务统计时会把刚来的员工也给统计进去了,这就是一个有问题的不可重复读。

 

讲完了出现的问题,接下来就是解决问题的几个方法了,表现为四个隔离级别(为了解决上面的三个问题而存在的)

1.读未提交  三个都不能解决

2.读已提交  可以解决脏读

3.可重复读  可以解决不可重复读问题和脏读问题

4.串行化  都可以解决

这里有句题外话:Mysql是默认提交事务的,并且mysql的隔离级别是:可重复读 ,oracle不是默认提交事务的,并且oracle的隔离级别是:读已提交。

关于事务的理解就到这,最主要的就是分清幻读和不可重复读的区别。

下一篇讲的是几种锁机制

参考博客:http://www.cnblogs.com/whgk/p/6182742.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值