事务是访问并可能更新数据库中各项数据项的一个程序执行单元。
事务应该具有四个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特征
事务具有的四个属性:
事务的原子性:一个事务包含多个操作,这些操作要么全部执行,要么全部不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,会滚到事务执行之前的状态
回滚实际上是一个比较高层抽象的概念,大多数DB在实现事务时,是在事务操作的数据快找上进行的,如果有错误并不会提交,而在其他支持简单事务的
系统中,不会在快照上更新,而是直接操作数据库,可以先预演一边所要执行的操作,如果失败则这些操作不会被执行,通过这种方式很简单的实现了原子性
事务的一致性:指事务操作前后,数据库中的数据是一致的(符合业务逻辑的完整操作),数据满足业务规则约束(例如:账号金额的转出和转入),与原子性对应
事务的隔离性:并发事物之间互相影响的程度,比如一个事务会不会读取到另一个未提交的事务修改的数据。在事务并发操作时,可能出现的问题有:
脏读:事物A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏读
不可重复读:在同一个事务中,对于同一份数据读取到的结果就不一致。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的办法就是对要修改的记录加锁
但这会导致锁的竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读
事务的持久性:事务提交之后,数据的修改是永久的