什么是事务:
事务就是程序中的一系列紧密操作,所有的操作都必须完成,一个事务开始,其中的操作要么全部完成,要么就撤销操作,全都不做。也就是事务的原子性。
事务的执行有两种结果,一种是所有步骤全部完成,另一种如果其中某个步骤执行失败,那么之前的所有操作回滚,在重新开始所有步骤。
事务的四个特性(ACDI):
原子性:原子性就是指事务的所有操作,要么全部做,要么都不做。
一致性:事务中包含的一系列的操作(增,删,查,改),这些操作必须同时成功 或者 同时失败,列如:
一个人从账户A中取出100转给B,如果因为某种原因,转账的时候出现差错,即A中钱已经取出来了,而B中并没 有增加钱。这个时候就是不一致的,这时候就需要进行回滚操作,来保持事务的一致性。
隔离性:一个事务的执行不能干扰另一个事务的执行,事务之间的操作是相互隔离的,一个事务对数据的使用对 其他并发事务是隔离的。对并发事务的执行有着很重要的作用,
持久性:就是事务成功执行的结果的影响是永久的,即对数据库中数据的改变时永久的,其他的操作都不会让事 务结果返回到事务发生之前。
在事务并发操作时,可能出现的问题有:
脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。
DBMS对数据库的保护通过4个方面来实现:
- 数据库的恢复
- 数据库的并发控制
- 数据库的完整性控制
- 数据库安全性控制