死锁mysql
四个必要条件linux
fork()进程数ios
数据库中事务相关内容算法
事务定义 :数据库事务是构成单一逻辑工做单元的操做集合sql
BEGIN TRANSACTION //事务开始 SQL1 SQL2 COMMIT/ROLLBACK //事务提交或回滚
特性 :acid数据库
a(Atomicity) 原子性 跟锁仍是有区别,能够两个事务同时处理同一个资源,可是每一个事务的全部操做必需要么都成功,要么都失败。ubuntu
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到内存中,并执行。