1.什么是并发操作?
并发操作是指同一时间可能有多个用户对同一数据进行读写操作.
2.并发操作对数据的影响
如果对并发操作不做任何控制的话,会造成数据的不完整性。可能造成读脏数据,不可重复读,丢失修改还有幻读。
3.事务的定义
(1)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
(2)一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于 事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
(3)隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这 意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
(4)持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
4.对数据不完整性的举例
4.1 丢失修改
当两个或多个事务(或两个或多个用户)选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在(或每个用户操作时并不会考虑同一时刻是否有别的用户进行着同样的操作)。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
选课:学生A、学生B、课程1的余量=20
a.学生A选择课程1时,先读出课程余量20
b.然而同一时刻(也可是不同时刻,只要在学生A更新数据之前),学生B也读出了课程1的余量20,
c.学生A选择此课程,课程1余量-1,写入数据库,此时课程1的余量=19;
d.学生B选择此课程,课程1余量-1(因为之前读出的课程1余量为20,-1后为19),写入数据库,此时课 程1的余量=19;
课程余量=19 数据正确吗?不正确。实际情况课程余量应更新为18;——B的修改覆盖了A的修改
4.2读脏数据
当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,
另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个
事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
1.张三的工资为2000,元 老板把张三的工资改为了8000元(但未提交事务)
2.张三查看自己的工资 ,发现工资变为了8000元
3.而后老板发现改错了,回滚了事务,张三的工资又变回了2000元
那么,张三读取的工资8000元就是脏数据。
4.3 不可重复读
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。
例子1:事务T1、事务T2、张三的工资=1000
a.事务T1中,张三读取了自己的工资为1000元,操作并没有完成
b.此时(事务T1读取了张三工资为1000元)事务2中,修改了张三的工资为2000元,并提交了事务.
c.此时(事务T1读取了张三工资为1000元,事务T2修改了张三的工资为2000元)在事务1中,张三再次读 取自己的工资时,工资变为了2000
转载自http://blog.csdn.net/hanxuemin12345/article/details/21740699