数据库事务


数据库事务
* 数据库事务定义
* 数据库事务是一个或一组sql操作序列的集合,这个集合里的操作要么全部成功,要么全部失败;有些业务(比如银行转账)必须使用事务控制,才能满足应用需求。事务的四大特性是原子性、一致性、隔离性、持久性,任何数据库的事务实现机制都必须保证这四个特性,简称ACID。
* 数据库特性
* 原子性
* 事务的原子性指的是事务内的操作序列要么全部成功,要么全部失败。这个概念和操作系统的原子性是不一样的,通常所说的原子性操作是指操作不会被打断,即操作之间不会插入别的操作。原子性中要求的全部成功是比较容易实现的,正常情况下事务内的操作肯定是全部成功的,如果事务执行过程中遇到事务异常,数据库应该回滚到事务开始前的状态。
* 一致性
* 定义
数据库在事务开始前事务结束时必须都处于一致性的状态,比如A和B转账,转账事务开始前和结束后,A和B的钱总和必须是相等的,这样才能说这个事务保证了一致性。如果把A的钱减去100和B的钱加上100这个操作序列放在一个事务里,事务能保证原子性,从而实现了一致性,这样看来,一致性和原子性是密切相关的。
* 不一致性类型
常见的不一致性包括:丢失修改、脏读和不可重复读。
丢失修改:两个事务并发的修改同一数据,后执行的事务对数据的修改覆盖了第一个事务的修改。t1:读A=1,A=A+1=2;t2:读A=1,A=A+1=2。事务t1对数据A的修改丢失了。
脏读:一个事务读了另一个事务修改后又回滚了的数据。t1:读A=1,修改A=3,做其他的事,回滚事务A=1;t2:在t1的A=3和回滚A=1之间读到了A=3。事务t2读到了A=3这个脏数据。
不可重复度:一个事务中两次读同一个数据对象,两次读到的结果不一样。t1:读A=1,做其他的事,读A=3;t2:在t1读A=1和A=3之间,修改A=3。不可重复度有三种情况,在一个事务两次读之间,另一个事务插入、删除、更新都会造成不可重复读的情况。
数据库的这三种不一致性可以通过封锁机制来解决。
* 封锁机制
锁的类型包括写锁(X锁)和读硕(S锁)。如果一个事务对一个对象加了写锁,其他事务对这个对象不能加读锁,也不能加写锁;如果一个事务对一个对象加了读锁,其他事务对这个对象不能加写锁,但是可以加读锁,;
一级封锁协议:事务在修改一个数据对象之前,必须对这个数据对象加写锁,修改完数据释放读锁。修改时不可读写,可避免丢失修改。
二级封锁协议:在一级封锁协议的基础上,事务在读一个数据对象之前,必须对它加读锁,读完数据释放读锁。读时不可修改。可避免脏读。
三级封锁协议:在二级封锁协议的基础上,事务在读一个数据对象之前,必须对它加读锁,事务结束时数据释放读锁。加了读锁到事务结束前,其他事务都不可修改这个数据,可避免不可重复度。
* 隔离性
* 隔离性表示多个事务同时执行时,相互之间是隔离的。隔离性有强有弱,隔离级别越高,隔离性越强。隔离级别由低到高分别是READ UNCOMMITED、READ COMMITED、REPEATABLE READ、SERIALIZABLE这四种

隔离级别脏读不可重复读幻读
RC可能可能可能
RU不可能可能可能
RR不可能不可能可能
SERIALIZABLE不可能不可能不可能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值