事务及四大特性
数据库事务(Database Transaction),是指作为 单个逻辑工作单元执行的一系列操作,要么完全执行,要么都不执行
简单的来说:事务就是将一堆的sql语句绑在一起执行,要么都执行成功,要么都执行失败,都执行成狗才算成功,否则就恢复到SQL语句执行之前的状态
下面以银行转账为例,A转100块到B的账户,这至少需要两条SQL语句:
l 给A的账户减去100元;
update 账户表 set money=money-100 where name='A';
l 给B的账户加上100元。
update 账户表 set money=money+100 where name='B';
如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么B的账户没有加上100元,而A却减去了100元,在现实生活中这肯定是不允许的。
如果在转账过程中加入事务,则整个转账过程中执行的所有SQL语句会在一个事务中,而事务中的所有操作,要么全都成功,要么全都失败,不可能存在成功一半的情况。
也就是说给A的账户减去100元如果成功了,那么给B的账户加上100元的操作也必须是成功的;否则,给A减去100元以及给B加上100元都是失败的。
事务的ACID特性
(1)原子性
原子性意味着每个事务都必须看做是一个不可分割的单元。假设一个事务有两个或者多个任务组成,其中的语句必须同时成功才能认为整个事务才是成功的,如果事务失败,系统将会返回到该事务以前的状态
保证原子性是数据系统本身的职责,由DBMS的事务管理子系统实现
(2)一致性
事务执行的结果必须是数据库从一个一致性状态转换到另一个一致性状态。如果当数据库中只包括成功事务提交的结果时,数据库就处在一致性状态,如果数据库系统运行发生故障,某些事物尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已经写入物理数据库,这是数据库就处在一种不正确的状态。为了保证数据库处于一致性状态,所有的规则都必须应用在事务的修改,以保证所有数据的完整性和数据库的一致性。可见数据库的一致性和原子性是密不可分的。
确保单个事务的一致性是编写事务的应用程序员的职责,在系统运行中是由DBMS的完整性子系统实现的
(3)隔离性
一个事务的执行不能被其他事务干扰。即一个事物的内部操作和使用的数据对其他并发事务是隔离的。并发执行的各个事务之间不能相互干扰,即事务识别数据所处的状态,要么是另一并发事务修改它之前的状态,要么是其他事务修改它之后的状态,事务不会识别中间状态的数据
隔离性是由DBMS的并发控制子系统实现的
(4)持久性
一个事物一旦提交,它对数据库中数据的改变就应该是持久的。如果提交一个事务以后即使系统崩溃,或数据库因故障而受到破坏,那么重新启动计算机庵后,DBMS也应该能够恢复,该事务的结果依然是存在的
保证事务ACID特性是事务管理的首要任务,可以说对数据库中的数据保护是围绕着实现事务的特性而达到的