数据库事务问题

版权声明:本文为博主原创文章,采用知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。(忽悠....) https://blog.csdn.net/qq_30607881/article/details/84948402

事务的 一致性

1.事务的一致性典型的问题体现是银行的转账问题

事务的一致性:内部一致性和外部一致性

1.外部的一致性:由外部的应用编码来实现,即银行的应用在进行转账的操作时,必须在同一事务内部调用对账户A和账户B的操作。如果在这个阶段出现错误,这不是数据库本身能解决的,也不属于我们要讨论的范围
2.数据库内部的一致性:在同一个事物内部的一组操作必须全部成功(或者全部失败)。这就是事物处理的原子性

事务的原子性

事务的原子性是保证数据的前提:为了实现事务的原子性,需要通过日志将所有对数据的操作写入日志,如果遇到事务中的一部分执行成功,另一部分由于突然断电,或者系统崩溃等问题,可以通过回溯日志的方式,撤销已经执行成功的操作,从而达到全部执行失败的效果

体现事务原子性和数据库一致性和持久性的常见场景

数据库崩溃后重启,此时数据库处于不一致的状态,此时数据库必须做crash recovery操作,大致步骤如下:

a、通过日志REDO(重演所有执行成功但是未写入到磁盘的操作)

b、再对到数据库崩溃前没有执行完成的事务进行UNDO(撤销所有执行了一部分,但是有一部份还没有执行完成,且尚未提交的操作,保证事务的原子性)

c、crash recovery结束后,数据库恢复了一致性,可以继续工作

多线程事务的问题

  1. 引入隔离性,既保证每一个事务看到的数据是一致的,确保一个事务在处理数据的同时,没有其他事务对自己正在处理的数据进行干扰,就好像其他事务都是不存在的一样,即事务在并发执行后的状态,和串行执行后的状态时一样的,实现隔离性主要通过加锁的方式。

  2. 锁的应用 :
    悲观锁 乐观锁

猜你喜欢

转载自blog.csdn.net/qq_30607881/article/details/84948402