事务的四个特性:ACID
- 原子性 要么全部成功,要么全部失败回滚
- 一致性 一个事务执行之前和执行之后都必须处于一致性状态;A和B两者钱加起来一共是5000,那么不管A和B之间如何转账,还5000
- 隔离性 多用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 持久性 指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的
事务不隔离带来的问题:
- 更新丢失 两事务同时更新,一个失败回滚覆盖另一个事务的更新
- 脏读
- 不可重复读
- 虚读(幻读)
事务隔离的级别
为此我们需要通过提供不同类型的“锁”机制针对数据库事务进行不同程度的并发访问控制,由此产生了不同的事务隔离级别:
隔离级别(低->高)。SQL、SQL2标准定义了四种隔离级别:
●读未提交(Read Uncommitted)
含义解释:只限制同一数据写事务禁止其他写事务。解决”更新丢失”。(一事务写时禁止其他事务写)
名称解释:可读取未提交数据
所需的锁:排他写锁
●读提交(Read Committed)
含义解释:只限制同一数据写事务禁止其它读写事务。解决”脏读”,以及”更新丢失”。(一事务写时禁止其他事务读写)
名称解释:必须提交以后的数据才能被读取
所需的锁:排他写锁、瞬间共享读锁
●可重复读(Repeatable Read)
含义解释:限制同一数据写事务禁止其他读写事务,读事务禁止其它写事务(允许读)。解决”不可重复读”,以及”更新丢失”和”脏读”。(一事务写时禁止其他事务读写、一事务读时禁止其他事务写)
注意没有解决幻读,解决幻读的方法是增加范围锁(range lock)或者表锁。
名称解释:能够重复读取
所需的锁:排他写锁、共享读锁
●串行化(Serializable)
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。(一事务写时禁止其他事务读写、一事务读时禁止其他事务读写)
限制所有读写事务都必须串行化实行。