??事务是一组单元化的操作,这组操作可以保证要么全部成功,要么全部失败(只要有一个失败的操作,就会把其他已经成功的操作回滚)。
??一般所说的数据库事务,它是访问并可能更新数据库中各种数据项的一个程序执行单元,由一个有限的数据库操作序列构成。当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
??所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。
??事务的执行必须保证系统的一致性,就拿转账为例,A有300元,B有100元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是250元,B账户一定是150元。
??所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。事务有多种隔离级别。
??所谓的持久性,就是说一旦事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。
??事务的原子性、一致性和持久性,数据库管理系统采用日志来保证。日志记录了事务对数据库所做的操作,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的操作,使数据库退回到执行事务前的初始状态。
??事务的隔离性,数据库管理系统采用锁机制来实现。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。
??特别说明:原子性并不能保证一致性,所以有了原子性为什么还要一致性
??对于单个事务,原子性就能保证一致性,但是对于多个并发执行的事务,即使每个事务都是原子执行的,但它们同时执行的话,最终效果可能会不一致。举例如下:
有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。这就是事务特性除了原子性外还需要一致性。
??因此,要达到事务的一致性,除了要保证单个事务的原子性之外,还要保证事务之间的隔离性。
原文地址:https://www.cnblogs.com/xtiger/p/10513908.html