前言
本篇文章对数据库事务进行简单的总结记录
1、 事务有一个优先的数据库操作序列构成,这些操作要么全部执行,要不全部不执行,是一个不可分割的工作单位。
2. 在mysql中只有使用了innodb的数据库引擎的数据库或者表才支持事务。
3. 事务用来维护数据库的完整性,成批的SQL语句要么全部执行,要么全部不执行。
一、原子性?
一个事务的全部操作,要么全部完成要么全部不执行,事务执行过程中如果发生错误,全被回滚(rollback)到事务开始前的状态,就像这个事务从未被执行过一样。
二、持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
三、一致性
事务开始之前或者结束之后,数据库的完整性没有被破坏,这表示写入的资料必须完全符合所有的预设规则,这包括资料的精确度、串联性以及后续数据库可以自发完成预定的工作(例如A向B转账,不能A扣了钱,B没收到。)
四、隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事物并发执行时由于交叉执行而导致数据不一致性问题,事务隔离分为不同的级别,包括:读未提交(Read uncommitted)、读提交(Read committed)、可重复读(repeatable read)和串行化(Serializable)
1、读未提交
事物A未提交的数据,事物B能读到,这里读取到的数据就是脏数据,这种隔离级别最低,数据库的隔离级别都高于这个级别。(发工资案例,A未提交,但B读到,A修改后,B发现数据修改了。)
2、读已提交
事物A未提交的数据,事物B不能读到,即比较之后,才能读到。这种隔离级别高于读未提交,是Oracle的默认隔离级别。
读提交避免了脏读会导致不可重复度问题,即两次读到的数据可能不一致(A先读取了数据,B紧接着更新了数据,并提交了事务,而A再次读取数据时,数据已经发生了改变)。大多数数据库的默认级别都是读已提交,除了Oracle之外,还有SQL server。
3、可重复读
事务A和事务B,事务A提交事务之后,事务B读取不到。事务B可重复读取数据。这种隔离级别高于读已提交。简单来说,对方提交的数据,我还是读取不到。
可重复读是mysql使用innodb的默认隔离级别。
可重复读解决了不可重复度问题,但会出现幻读的问题。
4、串行化
事务A操作数据库时,事务B不能操作,这种隔离级别很少使用,吞吐量太低,用户体验差,可以避免幻读。
五、提交回滚
start transaction
insert into ...
delete from ...
rollback/commit