事务是一组单元化的操做,这组操做能够保证要么所有成功,要么所有失败(只要有一个失败的操做,就会把其余已经成功的操做回滚)。数据库
通常所说的数据库事务,它是访问并可能更新数据库中各类数据项的一个程序执行单元,由一个有限的数据库操做序列构成。当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)须要确保该事务中的全部操做都成功完成且其结果被永久保存在数据库中,若是事务中有的操做没有成功完成,则事务中的全部操做都须要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其余事务的执行无影响,全部的事务都好像在独立的运行。并发
所谓的原子性就是说,在整个事务中的全部操做,要么所有完成,要么所有不作,没有中间状态。对于事务在执行中发生错误,全部的操做都会被回滚,整个事务就像从没被执行过同样。 spa
事务的执行必须保证系统的一致性,就拿转帐为例,A有300元,B有100元,若是在一个事务里A成功转给B50元,那么无论并发多少,无论发生什么,只要事务执行成功了,那么最后A帐户必定是250元,B帐户必定是150元。 日志
所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其余事务感知。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始以前就已经结束,要么在T1结束以后才开始,这样每一个事务都感受不到有其余事务在并发地执行。事务有多种隔离级别。code
所谓的持久性,就是说一旦事务完成了,那么事务对数据所作的变动就彻底保存在了数据库中,即便发生停电,系统宕机也是如此。blog
事务的原子性、一致性和持久性,数据库管理系统采用日志来保证。日志记录了事务对数据库所作的操做,若是某个事务在执行过程当中发生错误,就能够根据日志,撤销事务对数据库已作的操做,使数据库退回到执行事务前的初始状态。事务
事务的隔离性,数据库管理系统采用锁机制来实现。当多个事务同时更新数据库中相同的数据时,只容许持有锁的事务能更新该数据,其余事务必须等待,直到前一个事务释放了锁,其余事务才有机会更新该数据。class
特别说明:原子性并不能保证一致性,因此有了原子性为何还要一致性date
对于单个事务,原子性就能保证一致性,可是对于多个并发执行的事务,即便每一个事务都是原子执行的,但它们同时执行的话,最终效果可能会不一致。举例以下:程序
有A、B、C三个帐户各有200元钱,其中事务1是A向B转帐100,则执行语句以下:
update A set amount=amount-100 where id = 1; update B set amount=amount+100 where id = 1;
事务2是C向B转帐100,则执行语句以下:
update C set amount=amount-100 where id = 1; update B set amount=amount+100 where id = 1;
若是事务1和事务2同时执行的一致性结果应该是B帐户里面有300元钱,可是在并发事务下,事务1和事务2同时执行时,两个事务读到的帐户B的当前金额均可能是100(脏读),无论两个事务谁先执行完成,最终的执行结果都是B帐户金额为200。这就是事务特性除了原子性外还须要一致性。所以,要达到事务的一致性,除了要保证单个事务的原子性以外,还要保证事务之间的隔离性