事务并发会导致:丢失修改、脏读、不可重复读、幻读。
丢失修改:事务A修改了某行数据后,没有提交,事务B也同时修改了该行数据;这样在事务A中,修改就失效了,即丢失了修改。
脏读:事务读取了别的事务更新了但没有提交的数据。
不可重复读:同一个事务内同一个查询语句执行多次得到的数据内容不一致。
幻读:同一个事务内同一个查询语句执行多次得到的数据行数不一致。
需要特别说明的是:出现脏读的情况下,一定会出现不可重复读、幻读等问题;
不可重复读针对的是数据行内容的更新操作,幻读针对的是删除或者新增操作。
为了解决以上问题,数据库采用不同的隔离级别,一共有4种:
读未提交(Read-uncommitted): 可以读取事务未提交的数据,解决了丢失修改,无法解决其它3个问题。
读未提交(Read-committed):可以读取事务提交的数据,解决了脏读问题。
可重复读(Repeatable-read):对事务提交的数据也进行了某种筛选,达到可重复读,但幻读仍会发生。但是在mysql中Innodb引擎解决了幻读。
串行化(Serialize):所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。