一个事务的例子:
tim要给bill转账100块钱:
1.检查tim的账户余额是否大于100块;
2.tim的账户减少100块;
3.bill的账户增加100块;
这三个操作就是一个事务,必须打包执行,要么全部成功,要么全部不执行,其中任何一个操作的失败都会导致所有三个操作“不执行”——回滚。
事务的ACID特性
原子性:
一个事务必须保证其中的操作要么全部执行,要么全部回滚,不可能存在只执行了一部分这种情况出现。
一致性:
数据必须保证从一种一致性的状态转换为另一种一致性状态 。
比如上一个事务中执行了第二步时系统崩溃了,数据也不会出现bill的账户少了100块,但是tim的账户没变的情况。要么维持原装(全部回滚),要么bill少了100块同时tim多了100块,只有这两种一致性状态的。
隔离性:
在一个事务未执行完毕时,通常会保证其他Session 无法看到这个事务的执行结果。
持久性:
事务一旦commit,则数据就会保存下来,即使提交完之后系统崩溃,数据也不会丢失。
在多用户都用事务同时访问同一个数据资源的情况下,有可能造成以下几种数据错误:
不可重复读:
如果一个用户在一个事务中多次读取一条数据,而另外一个用户则同时更新啦这条数据,造成第一个用户多次读取数据不一致。
脏读:
第一个事务读取第二个事务正在更新的数据表,如果第二个事务还没有更新