数据库事务及隔离级别

1数据库四大特性:
数据库具有事务安全性,同时也具有ACID四大特性:原子性、一致性、隔离性、持久性
⑴ 原子性(Atomicity)
  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
⑷ 持久性(Durability)
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
2无隔离性产生的问题:
当数据库事务不具有隔离性时,此时如果有多个事务对数据库中的数据进行读取操作时,可能存在对数据库中同一数据进行操作,此时就会产生读取一些问题,主要有以下3个读取问题:
(1)脏读:脏读指的是有多个事务对数据库进行操作时,如果此时有一个事务对一条数据进行了修改,并且此时该事务还没有进行事务提交,此时另外一个事务正好也对该条数据进行读取,第一次读取时假如数据是A,但由于被另外一个事务修改为了B,当这个事务再次读取这个数据时发现是B,与第一次读取的该数据的值不一样。这样就是产生了脏读。
脏读的特点是:多个事务对同一条记录进行了操作,其中有事务对该记录进行了修改,但没有完成事务提交操作,此时其它事务对该记录进行了读取,多次读取数据值不一样。
(3)不可重复读:指的是多个事务对同一数据记录进行了操作,其中有事务T1对该记录进行读取时读取到一个值,当事务T1读取完成后,此时另外一个事务T2对该记录进行修改并且进行了事务提交,当食物T1再次读取该记录时发现与上次读取到的数据值不一样。
脏读与不可重复读的区别是:脏读中对数据修改的事务并没有进行事务提交,会进行事务的回滚操作,而不可重复读对数据进行修改的事务对事务进行了提交,最后读取的数据是最后的数据。
(4)虚读(幻读):幻读指的是在多个事务进行并发执行时,一个事务T1对数据库表的一行数据都进行了相同的修改,例如对某行数据都为1的记录都修改为了2,并且进行了事务提交,而之后另外一个事务T2又从新在该行中添加一个数据为1,当刚才操作事务T1的用户如果对该行记录进行查看时发现有一个记录没有发生改变,就像产生了幻觉一样,这就造成了幻读。
3.脏读、不可重复读、幻读的区别:
脏读中对数据进行修改的事务进行了事务提交,而不可重复读和幻读对数据修改的事务没有进行提交,同时脏读、不可重复读都是对一条记录数据的读取问题,而幻读指的是对一行数据进行读取。
4.数据库的隔离级别
(1)Serializable(串行化):可避免脏读、不可重复读、幻读
(2)Repeatable read(可重复读):可避免脏读、不可重复读的问题发生
(3)Read commited(读已提交):可避免脏读的问题的发生
(4)Read uncommited(读未提交):最低级别,任何读的问题无法保证避免。
对于mysql而言默认的隔离级别为 Repeatedable Read(可重复度),可以避免脏读、不可重复读上面Serializable级别最高,Read uncommited级别最低,但级别越高对数据的读取就越慢,对于Seriablizable而言是对这个数据库表加锁,锁的粒度是整张表,即一个事务获取到锁对数据库某个数据表进行操作时其它事务必须等待该事务完成操作后释放锁才能执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值