1.事务定义
事务是一个工作单元,对数据库执行。事务是在一个逻辑顺序,无论是由用户手动或某种数据库程序自动完成的工作单位或序列。
事务是指一个或多个更改数据库的传播。例如,如果正在创建一个记录或更新记录从表中删除一条记录,那么正在执行的事务放在表中。重要的是要控制事务,以确保数据的完整性和处理数据库错误。
2.ACID
事务具有以下四个标准属性的缩写ACID,通常被称为:
-
原子性(Atomic): 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
-
一致性(Consistent): 确保数据库正确地改变状态后成功提交的事务。任何时刻,数据库对用户的视角始终是按事务提交的顺序一致的,即使数据库恢复,也不能出现后提交的事务存在,而先提交的事务不存在的情况。
-
隔离性(Isolated): 一个事务所做的修改在最终提交以前,对其它事务是不可见的。有4种隔离等级,读未提交,读已提交,可重复度,串行化。
-
持久性(Durable):一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
ACID的关系图:
3.事务的隔离级别
-
读未提交(READ UNCOMMITTED)
表示可以读到其他会话未提交的数据
-
读已提交(READ COMMITTED)
表示可以读到其他会话已提交的数据,pg默认的隔离等级
-
重复读(REPEATABLE READ)
表示在一个事务中,执行同一条SQL,读到的是同样的数据(即使被读的数据可能已经被其他会话修改并提交)
-
串行化(SERIALIZABLE)
表示并行事务模拟串行执行,违反串行执行规则的事务,将回滚
常见的关系型数据库的默认事务隔离级别采用的是READ COMMITED,例如PostgreSQL、ORACLE、SQL Server和DB2。但是MySQL的默认事务隔离级别是REPEATABLE_READ。
在PostgreSQL中的事务隔离级别参数为transaction_isolation。
4.单用户情况下的事务
单用户情况下的事务,没有并行问题,属于串行事务,仅体现一致,原子性,持久化。
5.多用户情况下的事务
-
脏读(dirty read):一个事务读取了另一个未提交的事务写入的数据。
-
不可重复读(nonrepeatable read):在一个事务中,重复读取同一条数据,发现数据被已提交的事务修改。
-
幻读(nonrepeatable read):一个事务开始后,需要根据数据库中现有的数据做一些更新,于是重新执行一个查询,返回符合查询条件的行,这时发现这些行因为其它最近提交的事务而发生了改变,导致现有事务如果再进行下去可能发发生逻辑上的错误。T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
不同事务隔离级别的行为见表:
多用户情况下的事务并发处理
(1)读写不冲突
(2)读到什么数据,取决于事务隔离级别