Transaction事务类似一种集合,代表着一系列的数据库操作,其结果会使数据库变为一个整体,因此不可分割。
事务状态:活跃状态、部分提交状态、失败状态、中止状态、提交状态
事务的四大特性(ACID):
原子性(Atomicity):事务要么全部执行,要么全部失败;不会存在一个事务的部分内容完成的现象。
一致性(consistency):事务的起始和结束,数据应当是不变的。
隔离性(Isolation):一个事务的执行不受外界其他事务
持久性(Duration):一个事务提交之后,对数据库的改变是永久的。
ACID特性是由relational database来实现的,其中DBMS采用日志log来保证原子性、一致性、持久性。log记录了事务对数据库所做的更新,如果运行过程中产生错误可以根据log撤销已经做的更新,rollback到开始之前的状态。
DBMS使用锁lock机制来实现隔离性,在并发场景下,只有获得锁的事务才可以更新该数据,其他事务要等待到获得锁才可以更新。
四种事务相互影响:
脏读:事务A读到了事务B未提交的数据。
不可重复读:一个事务范围内,两次查询返回了不同的数据,原因是在两次查询的间隔,其他事务对数据进行了修改。
幻读:事务A正在向表中插入数据,而事务B对表中全部数据行进行了修改。这时事务A会发现还有未修改的数据。
丢失更新:
两个事务同时对一条数据做修改,导致B的修改覆盖了A。
事务的隔离级别:
读取未提交:最低级别隔离,会产生各种事务问题
读取已提交:事务提交后,结果才可以被其他事务看见,可以解决脏读问题。
可重复读:同一个事务中,对同一份数据的读取结果总是相同的,无论是否其他事务对其进行操作,可以避免不可重复读和丢失更新
可串行化:事务串行化,隔离级别最高,完全服从ACID,牺牲了系统的并发性,所有事务依次执行,解决了并发事务的问题。