数据库的事务
事务就是一个对数据库操作的序列,是一个不可分割的工作单位,要不这个序列里面的操作全部执行,要不全部不执行。
事务的特性
- 原子性(Atomicity):事务的原子性是指一个事务是一个不可分割的工作单位,要不全部执行,要不全部不执行。
- 持久性(Durability):持久性即当一个事提交后,对数据库的改变是永久性的,不会被回滚。
- 一致性(Consistency):一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性(Isolation):事务隔离性是指多个事务并发执行时,相互之间无影响。
事物之间产生影响的种类
- 脏读
- 不可重复读
- 幻读
- 丢失更新
1.脏读
一个事务读取了另一个事务未提交的数据
2.不可重复读
就是在一个事务范围内,两次相同的查询会返回两个不同的数据,是因为在此间隔内有其他事务对数据进行了修改。如下图:
3.丢失更新
两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
1.4幻读
幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.
事务的隔离级别
目的:为了避免事务与事务之间相互影响,所以要给事务的执行设立隔离
隔离级别 | 脏读 | 丢失更新 | 不可重复读 | 幻读 | 并发模型 | 更新冲突检测 |
---|---|---|---|---|---|---|
未提交读:(read uncommitted) | 是 | 是 | 是 | 幻读 | 悲观 | 否 |
已提交读:(read committed) | 否 | 是 | 是 | 是 | 悲观 | 否 |
可重复读:(repeatable read) | 否 | 否 | 否 | 是 | 悲观 | 否 |
可串行读:(serializable) | 否 | 否 | 否 | 否 | 悲观 | 否 |
数据库隔离事务之间的影响是通过锁来实现的,通过阻塞来隔离上述影响,级别越高,加的锁越多,效率越地下
- 未提交读:在读取数据时不会加任何锁,也不会进行检测,可能会读到没有提交的数据。
- 已提交读:只读取提交的数据等待其他事物释放排他锁,读数据的共享锁在读操作完成后会立即释放。这个隔离级别是sql server默认级别。
- 可重复读:像已提交读一样,但共享锁会保持到事物结束才会释放。
- 可串行读:类似于可重复读,但锁不仅会锁定所查询的数据,也会锁定所查询的范围,这样就阻止了新数据插入所查询的范围。
总结:
事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。
数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。