事务定义,数据库事务的四大特性以及事务的隔离级别

事务的定义

我们常说事务事务,事务在软件设计中事务很重要,那么到底什么是事务呢?

  • 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中指访问并访问并有有可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操控的语言货编程语言所引起(如SQL,C++或Java)书写的用户程序的执行所引起。
    并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成

  • 关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

数据库事务的四大特性

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:
1.事务的四大特性(ACID):分别是原子性,一致性,隔离性,持久性

  • 原子性(Atomicity)
    原子性是指事务包含的所有操作,要么全部成功,要么全部回滚,就像转账要么钱转了对方也收到,要么转账失败。可见因为转账账户扣钱,收款加钱这一组过程是一个事务,是最小单元。因此成功的话,要将这一过程全部执行到数据库中,同步数据,而失败则不能对数据库造成影响。

  • 一致性(Consistency)
    一致性指是指事务从一个一致过程,转换到另一个一致过程,就是事务执行前后都必须处于一致性状态。
    比如转账的又一体现,转帐前A,B的账户加起来一共是2000,所以无论你们怎么转,转几次,在事务结束后,A和B账户金额加起来必须还是2000。

  • 隔离性(Isolation)
    隔离性是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    即这么一个效果,对任意的两个事务1和事务2来说,在事务1来看,事务2要么是在事务1开始前结束了,要么在事务1开始后才执行,这样每个事务都感觉不到有其他事务在并发地执行。后面会讲隔离级别的问题。

  • 持久性(Durability)
    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
    例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

事务的隔离级别

前中上面的三种性质,不会操作时候查询的时候看见的结果不一样,而不同的隔离级别会造成不同问题,多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

  1. 脏读
    脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

当一个事务反复修改某个值,而未提交,突然来了一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。如:用户A向用户B转账100元,对应SQL命令如下

update account set money=money+100 where name=’B’;  (此时A通知B)
update account set money=money - 100 where name=’A’;

当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

  1. 不可重复读
    不可重复读的现象指的是在一个事务处理过程中前后,先前读取的数据不一样,造成这个原因的是因为在这个事务处理的读取间隔期间,有另外一个事务修改然后提交了。实际上不可重复读不是问题,毕竟显现生活有很多事情并行,所以不是看单一结果而是最后看最后结果。就好像你借钱给朋友,朋友一直不还,你都觉得他不可能还了,突然有一天他良心发现还了,你这个月的存款计划多了这笔钱,难道会是个问题吗哈哈哈,手动滑稽!!!

即例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
3. 虚读(幻读)
幻读是事务在非独立执行时发生的一种现象。

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)

MySQL数据库四种隔离级别:

  1. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
  2. Repeatable read (可重复读):可避免脏读、不可重复读的发生。
  3. Read committed (读已提交):可避免脏读的发生。
  4. Read uncommitted (读未提交):最低级别,任何情况都无法保证。

4种隔离级别种,Serializable串行化隔离级别最高,执行效率是最低的,越安全,执行越慢。Serializable这样的级别,就是以锁表的形式(类似于Java多线程中的锁),使得其他得线程都在外面等。MySql默认得是 Repeatable read可重复读得方式,而Oracle数据库则是默认Read committed,读已提交。


注意mysql默认手动开启提交,即不自动提交。

参考博文:https://www.cnblogs.com/fjdingsd/p/5273008.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值