数据库事务隔离级别定义
- Read Uncommitted(可以读到未提交数据):
- 如果一个事务已经开始读取数据,但是未提交,则另外一个事务无论是读还是写,都允许继续访问该数据;
- 如果一个事务已经开始写数据,但是未提交,则另外一个事不允许同时进行写操作,但允许事务读此数据。
事务1(早发起,但仍未提交)
事务2(晚发起,但针对同一块数据)
读 →
读 √
写 √
写 →
读 √
写 ×
- Read Committed(只能读到已提交数据):
- 如果一个事务已经开始读取数据,但是未提交,则另外一个事务可以读该数据,也可以写该数据;
- 如果一个事务已经开始写数据,但是未提交,则禁止其他事务写数据和读取该数据。
事务1(早发起,但仍未提交)
事务2(晚发起,但针对同一块数据)
读 →
读 √
写 √
写 →
读 ×
写 ×
- Repeatable Read(可重复读取数据):
- 如果一个事务已经开始读取数据,但是未提交,则另外的事务不允许同时写该数据,但允许读该数据;
- 如果一个事务已经开始写数据,但是未提交,则禁止其他事务读或写该数据。
事务1(早发起,但仍未提交)
事务2(晚发起,但针对同一块数据)
读 →
读 √
写 ×
写 →
读 ×
写 ×
- Serializable(序列化):
- 事务只能一个接着一个地执行,不能并发执行。
事务1(早发起,但仍未提交)
事务2(晚发起,但针对同一块数据)
读 →
读 ×
写 ×
写 →
读 ×
写 ×
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。
它能够避免脏读取,而且具有较好的并发性能。
提高隔离级别会导致并发问题,在可能出现这类问题的场合,可以由应用程序采用悲观锁或乐观锁来控制。