事务是逻辑上的一组操作,要么都执行,要么都不执行。
四大特性 原子性:原子操作,不可分割,要么都成功要么都不成功
一致性:从一个确定状态到另外一个确定状态
隔离性:并发下事务之间不相互干扰
持久性:事务一旦提交,他对数据库的修改将是持久的,即使故障也不应对其有影响。
并发事务的四个问题
脏读:一个事务读取到了另外一个事务没有提交的数据
丢失修改:两个事务都对某数据进行修改,两事务读到的是一样的,修改有前后顺序,导致先修改的这次操作被覆盖
不可重复读:一个事务读了一次,另一个事务对此数据进行修改,并且提交,则此事务再读到的数据和之前读到的不一致
幻读:与不可重复度类似,一个事务先读了一次,另外一个事务进行了插入操作,导致此事务再执行同样的查询获得了更多的结果,就像幻觉一样
不可重复读的关键在于修改,而幻读的关键在于插入或删除
引入另外一个概念,事务隔离级别,来解决上述问题
read uncommitted读取未提交:最低的级别,可能导致脏读、幻读或不可重复读;
read committed读取已提交:只读取其他事务已经提交的,解决了脏读问题,幻读和不可重复读没有解决。
repeatable read可重复读:对同一字段的多次读取结果相同,除非该事物本身进行修改,不能解决幻读
serializable可串行化:级别最高,依次执行事务,并发最差,可防止脏读、幻读或不可重复读
事实上,innoDB通过默认的可重复读+Next -key Lock锁来达到串行化的效果