事务并发是可能存在什么问题?

题目

事务并发是可能存在什么问题?

解析

        在实际开发和使用中,其实幻读问题是可以接受也符合用户的心理预期,比如在淘宝双十一抢东西,点击“购买”,成功进入**“下单页面”,结果到“付款页面”**却提示已经被抢完,这是可以接受的。

 

不可重复读和脏读的区别

        脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是在同一事务内读取了前一事务提交的数据,即前一次读到的数据是另一个事务提交前,后一次读到的数据是提交后的。

 
不可重复读和幻读的区别
  • 不可重复读:重点在于修改,即多次读取一条记录发现其中某些列的值被修改。
  • 幻读:重点在于新增或删除,即多次读取一条记录发现记录增多或减少。
正确答案

1. 脏读(Dirty Read)

脏数据所指的就是未提交的数据,而脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。比如,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被称为脏读。

2. 不可重复读(Non-repeatable Read)

一个事务先后读取同一条记录,而事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,我们称之为不可重复读。例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发生了不可重复读。

3. 幻读(Phantom Read)

一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。