并发操作概念:数据库支持数据共享,也就是说允许多事务同时操作同一数据。
事务:完整的做一件事。
并发操作带来的问题与描述:
并发可能的问题 | 问题描述 |
丢失修改 | 前提条件:两个或多个事务选择同一条数据,然后基于最初选定的值进行更新操作。 示例: 1、假设:事务X,事务Y,表中初始值initial=100。 2、演绎过程: a.01时刻,X读取initial=100; b.02时刻,Y读取initial=100; b.03时刻,事务X更新表initial=initial-10,此时数据库中的值为90; c.04时刻,事务Y更新表initial=initial-1,数据库中的值为99; 实际上应该为89. |
脏读 | 前提条件:一个事务访问数据,并进行修改,但尚未提交到数据库;另一个事务也访问这条数据,然后进行操作,这个事务读取的是尚未更新的脏数据。 示例: 1、假设:事务X,事务Y,表中初始值initial=100。 2、演绎过程: a.事务X: a1.读取initial=100 a2.initial=initial-10; -->90 a3.initial=initial+5; -->95 a4.提交事务commit. B.事务Y: b1.事务X进行到a2,此时表中的数据是90; b2.Y开始读取initial值,90,但X尚未提交完整; b3.然后X进行第三步, initial值更新为95。 X提交之前,Y获取的90 就是脏数据。 |
不可重复读 | 前提条件:第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题 示例: 1、假设:事务X,事务Y,表中初始值initial=100。 2、演绎过程: a.X读取initial=100,尚未完成操作; b.Y读取initial=100,+100提交; c.X再读取,Wow! 200 |