1、事务的特性:
https://www.oschina.net/group/database?circle=mysql
原子性、一致性、持久性、隔离性:
原子性:
一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
一致性:
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
持久性:
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
隔离性:
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
事务隔离级别:
数据库提供了四种事务隔离级别,分别为:
- 读未提交(脏读):允许读取尚未提交的数据,允许脏读
- 读已提交(不可重复读):允许读取事务已经提交的数据
- 可重复读(幻读):在同一个事务内的查询结果都是和事务开始时刻查询一致的(InnoDB默认级别)
- 串行化:所有事务逐个依次执行,每次读都需要获得表级共享锁,读写互相都会阻塞
其中,不同的隔离级别可能会存在不同并发问题,主要并发问题包括:
- 数据丢失:两个或多个事务操作相同数据,基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题———最后的更新覆盖了其他事务所做的更新
