学习笔记——事务的详细了解

 

什么是事务?

事务就是用来控制数据的安全的方法,跟数据库的操作有关的东西。就比如数据库增、删、改这些操作的安全性。

 

 

事务的作用?事务是用来干什么的?

在看事务是用来干什么之前,我们不妨先看看如果没有事务会发生生么样的情况。

例子:

还是拿那个经典的例子:小白要给小红转账1000元。

第一步:我们先从小白的账户中减去1000元。

第二步:我们给小红的账户加上1000元。

上面两步看上去很简单,操作一些简单的sql语句就行。但是上面两步的执行是需要时间的,有一种情况就是,执行完第一步还没来得及执行第二步,然后程序突然崩溃了(比如:服务器炸了,程序抛异常了等),很可能第二步就步执行了。这样就出现了小白少了1000块,但是小红没有得到那1000块的情况,这谁受得了。

事务就是来阻止类似这类事情发生的,如果执行第一步出错了,事务就会回滚,把小白的账户还原到转账之前。

 

事务要满足什么样的特性才能保证数据安全呢?

事务的4大特性

 

1、原子性:事务中无论需要执行多少步,都相当于是最小单元不可分割,要么全部完成,要么全部都不起作用。就像那个转账的例子:要么两步都执行,出错就回滚,相当于都不执行。

2、一致性:执行事务的前后数据保持一致。整个数据集合要在事务前后一致。还用上面的例子:如果小白原来有2000元,小红原来有2000元。那么在执行转账事务前,他们一共是4000元。那么他们在转账事务完成后,也应该是4000元。如果有一步没有执行,那么他们金钱综合就不是4000,这样就违背了一致性原则。

刚学的时候原则性一致性分不太清,后来慢慢发现是他们的侧重点不同。原则性侧重于执行步骤要一起执行或者一起不执行,一致性则偏重于数据的一致不变。

3、隔离性:隔离性发生在并发多线程(或者是多人)操作的时候。不同的操作是隔离的互相之间不受影响。如:小白在转账的时候,刚刚查完自己账户里有2000块,打算转给小红。但是他在操作转钱的时候,小红那边比他快,先把小白的钱转给了自己,这样小白赚钱的时候就一脸懵逼,转不了。。。。。。隔离性就是并发多线程(或者是多人)操作的时候用来确保数据安全的。

4、持久性:就是事务操作后的数据是持久储存的,只要那块储存数据库数据的硬盘不坏,就算把服务器停了把电脑砸了,也能再获取其数据。

 

 

 事务是怎么实现上面的那些特性的呢?

 1、其中原子性一致性可以在发生错的的时候通过回滚来实现,而持久性一般不会有什么问题,只要把数据提交到数据库中保存到硬盘中就不会有这个问题。

2、而隔离性发生在多个事务并发操作(多个用户一起操作一个数据库)的情况下,事务是通过隔离级别来实现隔离性的。

(后面会写有哪些隔离级别)

 

什么是隔离级别?

上面说到为了满足事务的隔离性,使用了事务的隔离级别。如果没有隔离级别会发生什么事呢?

 

1、更新遗失:如果有连个人A和B,他们同时要修改一个数据   int money=2000   ;如果在A操作完  money = money-1     。在没有隔离的情况下,之后B立马又操作了  money = money+1   。这时候A再去看money这个数据,他会发现还是2000,这样A在其事务提交前更新的数据就遗失了。

2、脏读:脏读就是读到了脏数据,读到了没用的数据。比如又A和B连个人,A开启了一个事务,对一个数据进行修改。此时A已经修改了这个数据,但是A的事务还没结束他还要去执行其他的操作。这时候B来读取了这个数据。但是在A操作其他数据的时候报错了,所以这个修改的数据就被回滚到原来的了。所以B读取的就是一个没用的脏数据,就是脏读。

3、不可重复读:读取同一个数据但是两次不一样。。。比如A开启一个事务,这个事务要读取一个数据(money)两次,A第一次读取了数据money是2000。然后此时B开启的事务将money这个数据修改了。那么A再次读取money这个数据两次就不一样了。A不能重复读到同一个数据了。(重点是另一个事务的修改数据使两次查到的结果不同

4、幻读:幻读跟不可重复读很相似,也是读取两次数据但是不一样,但是幻读是指多个数据不一样了,而不是一个数据不一样了。比如:A开启了一个事务读读取了一个表中有10行数据。然后B在那个表中添加了一行数据。这时候A再读就会发现有11行数据了。(重点是另一个事务的新增或者删除使得两次读取的结果不同

tip:不可重复度和幻读的的区别就好像你在班级了点名。不可重复度就是你第一次点小白是小白答到的,但是第二次点小白是他室友答的到,两个人长的不一样了。而幻读是第一次点名到了10人,第二次有11人答到,觉得发生幻觉了少点了一个人。

 

有那些隔离级别?

上面已经讨论和隔离级别的作用,还讨论了如果没有隔离级别会发生哪些不安全的情况,下面我们来讨论为了解决那些不安全的情况下有哪些隔离级别。

1、READ-UNCOMMITTED(读取未提交):允许读取还没有提交的数据,但是多个事务不能同时修改同一个数据。这是最低级的隔离级别。还可能会发生:脏读、不可重复读、幻读。

2、READ-COMMITTED(读取已提交):允许读取已经提交的数据,就是不可以读取还没提交的。还可能会发生:不可重复读、幻读。

3、REPEATABLE-READ(可重复读):在一个事务中多次读取同一个数据是相同的,除非自己的事务中修改了。这就是在A事务读取了money数据的时候,只允许A事务对money数据进行修改。阻止了脏读和不可重复读还可能发生:幻读。

4、SERIALIZABLE(可串行化):最高的隔离级别,所有的事务依次执行,这样多个事务间就不会有影响了,这样就相当于不是多个用户并发操作,而是同一个用户的操作,上面说过发生违反隔离性的是在并发操作的时候。可以避免所有的不安全情况。但是会损失系统效率。

 


 

 

欢迎提出意见

 

转载于:https://www.cnblogs.com/Eastry/p/11503652.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值