死锁
四个必要条件
fork()进程数
数据库中事务相关内容
事务定义 :数据库事务是构成单一逻辑工作单元的操作集合
BEGIN TRANSACTION //事务开始
SQL1
SQL2
COMMIT/ROLLBACK //事务提交或回滚
特性 :acid
a(Atomicity) 原子性 跟锁还是有区别,可以两个事务同时处理同一个资源,但是每个事务的所有操作必须要么都成功,要么都失败。
c(Consistency)一致性(能量守恒):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
i(Isolation)隔离性:并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
d(Durability)持久性:
事务并发的三个问题
脏读:A事务对数据进行修改的过程中,B事务读取该数据,A事务对该数据进行回滚,那么B事务读到了脏数据。
在事务1对A的处理过程中,事务2读取了A的值,但之后事务1回滚,导致事务2读取的A是未提交的脏数据。
不可重复读:A事务多次读取一个数据,在此过程中,B事务对该数据进行了修改并进行了提交,导致A事务读取同一数据时却读到了不同数值。
由于事务2对A的已提交修改,事务1前后两次读取的结果不一致。
幻读 :幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.(幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中,比如下面这种情况:)
事务1查询A<5的数据,由于事务2插入了一条A=4的数据,导致事务1两次查询得到的结果不一样
事务的隔离级别
? 事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低.
? 隔离级别从低到高依次是:读未提交->读已提交->可重复读->串行化
并发控制技术
乐观并发控制:对于并发执行可能冲突的操作,假定其不会真的冲突,允许并发执行,直到真正发生冲突时才去解决冲突,比如让事务回滚。
悲观并发控制:对于并发执行可能冲突的操作,假定其必定发生冲突,通过让事务等待(锁)或者中止(时间戳排序)的方式使并行的操作串行执行。
基于锁的并发控制
? 锁通常分为共享锁和排他锁两种类型
1.共享锁(S):事务T对数据A加共享锁,其他事务只能对A加共享锁但不能加排他锁。
2.排他锁(X):事务T对数据A加排他锁,其他事务对A既不能加共享锁也不能加排他锁
对于可能发生冲突的并发操作,锁使它们由并行变为串行执行,是一种悲观的并发控制。
故障恢复技术
- 事务故障:比如非法输入,系统出现死锁,导致事务无法继续执行。
事务的执行过程可以简化如下:
由于数据库存在立即修改和延迟修改,所以在事务执行过程中可能存在以下情况:
数据库系统是通过并发控制技术和日志恢复技术来对事务的ACID进行保证的,从而可以得到如下的关于数据库事务的概念体系结构。
+ 系统开始时启动bios(pc环境中,地址是0xFFFF0),第一阶段任务就是上电自检POST
+ bios第二阶段,本地设备初始化和枚举,runtime services,作用是检测顺序排在第一的可启动设备,并启动存放在设备中的操作系统。(当POST结束时,内存中POST相关代码会被丢弃,而runtime services代码一直保存在内存中)
+ 一般的linux会从磁盘中开始启动,磁盘的第一个扇区有主引导记录MBR(Master Boot Record)
? 前446字节是primary bootloader,包含了可执行代码和错误信息字符串。接下去64字节是磁盘的分区表,该分区表中包含了四条分区记录,每条分区记录为16字节,分区记录可以为空,若为空则表示分区不存在。最后是2个字节的magic number,这两个字节是固定的0xAA55,这两个字节的magic number可以用于判断该MBR记录是否存在。
? primary bootloader的作用就是用于寻找并定位secondary bootloader,也就是Stage 2 bootloader。它通过遍历分区表寻找可用的分区,当它发现可用的分区的时候,还是会继续扫描其他分区,确保其他分区是不可用的。然后从可用的分区中读取secondary bootloader到内存中,并执行。
原文:https://www.cnblogs.com/ustc-BlueSky/p/12535672.html