数据库事务:首先它是一系列操作,其次这个操作是需要在一个逻辑单元内执行的。也就是说这组操作要么完全执行、要么完全不执行。
为什么要引入事务这个概念?
还是那个很经典的粟子:你的银行卡有1000元现金(Balance=1000),某日某时刻你到银行柜台取钱,巧的是你的另一伴正拿着副卡在商场买东西刷卡,这个时候比如你要取1000元,而她买的东西也是500元(为说明问题不择手段了)。你取钱的动作分解为:
先检查帐户余额Balance>=1000,然后执行Balance-1000的操作,但Balance的新结果还未更新到数据库中;
同时另一张卡也在检查余额Balance>=1000,然后执行Balance-500的操作;
如果先更新你的操作那么结果是Balance=0,然后再更新她的操作Balance=500覆盖你刚才的结果,最终余额为500;
如果先更新她的操作那么结果是Balance=500,然后再更新你的操作Balance=0覆盖她刚才的结果,最终余额为0.
可以发现不论怎么算,只要操作顺序不一样结果就会不一样,而且不论怎么算结果银行都亏了,可银行也不傻嘛!所以就想出一个办法---事务,即一组操作要么完全执行要么完全不执行。具体实现对账户加锁就行了,还是上面的粟子:
先检查帐户余额Balance>=1000,然后执行lock(Balance),再执行Balance-1000的操作,直到将Balance=0的结果更新到数据库中才释放unlock(Balance);
同时另一张卡也在检查余额Balance>=1000,然后执行lock(Balance)却执行不了就要处于等待状态,至Balance处于unlock状态才能进行Balance新的更新操作;
由上面的粟子引出事务的四个特性(ACID):
1、原子性(Atomicity):事务必须是数据库的逻辑工作单位,即对数据的修改要么全执行要么全不执行;
2、一致性(Consistency):事务在完成时必须所有的数据都保持一致状态,即事务的执行结果是使数据库从一个一致性状态转变到另一个一致性状态;
3、隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各事务之间不能互相干扰;
4、持久性(Durability):一个事务一旦提交它对数据库中数据的改变就是永久的,即事务完成后它的结果影响是永久性的。
上述的ACID特性可能遭到破坏的因素有:
(1)多个事务并行运行,不同事务的操作交叉执行;
(2)事务在运行过程中被强行停止;
针对情况(1),数据库管理系统必须保证多个事务的交叉运行不影响这些事务的原子性;
针对情况(2),数据库管理系统必须保证被强行终止的事务对数据库和其他事务没有任何影响。