主要知识点总结
- 事务的概念:保证其他的用户所做的修改不会破坏结果
- 需要将一组SQL语句捆绑在特定的不可分割的称之为事务的包内。
- 本章提供在嵌入式SQL程序当中实现任何算法所需的技术
记住这些技术不是主要的目标,能够知道每一个功能在应用程序当中起到的作用才是重要的。
- 也就是对于数据库的引擎的函数调用
- 先声明宿主变量获取数据库返回的值
- 建立和数据库的连接 传入用户名和密码认证
- 断开连接前,必须对成功的事务进行commit对不成功的事务执行回滚rollback操作,撤销不成功事务的已做部分。
事务的概念
- 将几条SQL语句集合成一个不可分割的要么全有要么全无的事务包
- 因为有并发访问所以有事务
- 如果没有有效地对并发进行控制用户可能看到的就是一组永远不可能同时出现的数据元素集合
- 某个逻辑在执行过程当中必定会出现不一致状态,这是无法消除的,此时我们使用的方法是阻止其他的进程看到这些状态。
- 事务就是解决办法
- 事务要求更新必须在数据处于一致性的基础上进行。
隔离
- ==隔离保证了多个事务的同时进行。==
- 对于每个事务而言都好像是不受对方事务的影响相互隔离的工作在数据库上。
- 要么A在B之前执行完,要么A在B执行完之后执行
- 事务结束的时候释放锁
- 锁保证事务的隔离
- 跨越用户的交互行为时任然保持事务的活动性并不是一个好主意,通常要求在用户输入之前执行commit
- 回滚的同义词就是事务的异常中止
- ==原子性保证,一个事务当中的更新操作要么全部都发生要么一个都不发生。==
回滚
- 要支持回滚,数据库就应该有某种方法记录这些行的更新 并且将这些记录保存起来以备后用。
- 即使系统崩溃任然成立。
三大性质保证
- 隔离性
- 原子性
- 持久性
事务的隔离的保证和加锁
- 任何一种并发的事务集合,他们当中的一个必须在另一个事务的开始之前完成其所有的操作。
- 就好像这些事务是按照某种串行的顺序执行的。
- 这是可穿行性。
- 数据库系统实现隔离的最普遍的方法是对数据库行加锁。
- 简化的排他锁就是不区分读和写,一方有锁其他方等待。
- 行加锁是大多数数据库系统用以保证隔离的基本方法。
- 两个事物的访问导致死锁怎么办?
- ==当两个事物等待其他事物释放资源并且没有一个事物放弃资源使得没有事物可以进行那么将导致死锁。==
- ==从这两个事物当中选择一个事物回退,这称为死锁终止。==
- 需要重新执行被终止的事务,即重试。
- 因为之前执行产生的失败并不是逻辑上的问题,是时间调度上的问题所以有理由相信再执行一遍事务将成功完成。
事务执行期间不要进行用户交互
- 一个事物锁住了一行之后,这一事务执行期间的每一秒都阻止了想要访问这一行的其他用户。
- 所以最重要的一点就在事务执行时不应该发起任何交互。。
- 如果事务当中用户做别的事情去了,那么。。。其他事物等待的时间将是毁灭性的。
- 然而很多的情况下需要在事务的执行当中与用户进行交互。
没有封闭事务的用户交互
1. 用户通过一个事物先读取想要的信息,比如当前该航班的机票数量。读取完之后事务立马结束。
2. 用户根据读取到的数量进行操作,比如读取到10,那么用户就准备买5张。
3. 更新事务开始,用户将5张的信息提交给数据库,数据库得到数据会比对因为之前读取到的数据在用户决定买几张到提交之间其实是释放了锁的,其他的事务是可以操作该数据的,原始的10可能已经失效,所以此时数据库根据当前的实际数据来选择接受还是拒绝用户的提交。
有意思的来了:用户之前读到的是10,但是当提交5的时候,此时机票数据是3,将会显示无法购买,出现一种之前看还有再一点没了的奇怪现象但是这是事务系统通常需要接受的一种情况。