数据库事务的四大特性和隔离级别

   临近毕业,在跑工作的过程中发现,数据库的一些知识在笔试和面试中都经常考到,网上有漫天的相关资料,我根据我自己的理解将一些数据库的知识点简单总结一下,以便自己日后查漏补缺,同时也希望对其他新手能够起到一定的积极作用

一.事务的概念以及事务的四大特性

   事务(Transaction):简单的说就是对数据库进行的一个完整的操作,这个操作要么全部成功,要么全部失败,不能够被分割。

   在spring中,事务被分为一下两种:

  1. 编程式事务管理:将事务控制的代码嵌入到业务方法中,以此实现对事务提交、回滚的管理
  2. 声明式事务管理:将事务控制代码从业务方法中抽离出来,以声明的方式来实现对事物的管理,大多数情况下,声明式事务控制优于编程式事务管理。思想是以AOP的方式,将事务管理作为横切关注点,模块化。Spring用AOP支持声明式事务。

   事务的四大特性(ACID):

  1. 原子性(Atomicity):    不可分割,要么全部执行,要么全部失败回滚,失败回滚后,数据库的状态与改事务执行之前的数据库状态相同
  2. 一致性(Consistency):    在事务执行前后,整个数据库处于一致状态,保持数据的完整性;比如,A有500元,B有500元,A与B之间进行转账,在没有第三方介入的情况下,无论A和B之间进行多少次的转账,他们两个的总金额都应该是1000元
  3. 隔离性(Isolation):   即在事务存在并发的情况下,每个事务之间感觉不到对方的存在,互不干扰。
  4. 持久性(Durability):  事务成功执行完后,对数据库的改变是永久、不可改变的,即便系统崩溃,也能回到这个成功的状态。

二.事务的隔离级别

  1. 读未提交(Read Uncommitted) : 又被称为脏读,即一个事务读到另一个事务还没有提交的数据;这是MySQL数据库中隔离级别最低的,可能出现的问题有脏读、不可重复读、幻读
  2. 读已提交(Read Committed) : 又称不可重复读,即一个事务读到了另一个事务已经提交的数据,比如;当第一个事务在多次读取某一条数据时,第二个事务执行,对该数据进行了修改,那么第一个事务就会发现第二次读到的结果和之前不相同。为Oracle、Sql Server等数据库的默认隔离级别,可能出现的问题有不可重复读、幻读
  3. 可重复读(Repeated Read) :又称幻读Mysql默认的隔离级别,幻读是事务非独立执行时发生的一种现象。例如事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻读。 幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。可能出现的问题幻读
  4. 串行化(Serializable):MySQL数据库中隔离级别最高、最严格,避免了脏读、不可重复读、幻读的发生,但相应的,对数据库的性能会造成一定的影响

                               

备注(个人理解)

不可重复读是针对同一条、同一批数据,可能出现被修改的情况

幻读针对的是出现了新的数据(插入),导致两次读取的数据会出现不同的情况

参考文档:http://www.cnblogs.com/younes/archive/2010/09/09/1822436.html

   小弟初出茅庐,若有错误,希望指出,我会及时改正,非常感谢!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值