事物详解
事物是逻辑上的一组操作,要么内部操作都执行,要么都不执行。
举个例子,小明要给小红转500元,这个转账涉及到两个关键操作:第一,小明账户上的余额减少500元;第二,小红户上余额增加500元。如果这两个操作没有一并执行,或者说是只执行了一个,那肯定就是不行的了。而事物,就是要保证这两个操作要么成功要么失败。
事物的特性(ACID)
1.原子性:事物是最小的执行单元,不允许分割。就像原子一样,要么全部完成,要么全部不起作用。
2.一致性:执行事物前后,数据保持一致,多个事物对同一数据读取的结果是完全相同的。
3.隔离性:并发访问数据库时,一个事物不会被其他事物所干扰,各并发事物之间的数据库是独立的。
4.持久性:一个事物被提交后,它对数据库中数据的改变是持久性的,即使数据库发生故障也不应该对其有所影响。
并发事物带来的问题
- 脏读(Dirty read):当一个事物正在访问数据并且对数据进行修改,而这种修改还未提交到数据库中时,另一事物使用该数据。因为修改并未提交,所以取得的数据是还未改变的数据,这样所取到的数据被称为脏数据。
- 丢失修改(Lost to modify):指的是两个并发事物同时在对同一数据进行修改,在第一个事物修改数据后,第二个事物也修改数据。从而导致第一个事物的修改结果丢失;比如事物1读取到X=20,事物2也读取到X=20,而事物1先进行X=X+1操作,事物2进行X=X-1操作,最后的结果为X=19,这样事物1的修改就丢失掉了。
- 不可重复读(Unrepeatable-read):指在同一事物内多次读取同一数据,在这个事物还没结束时,另一个事物也访问了该数据。那么,在第一个事物中的两次读数据之间,由于第二个事物对数据进行了修改导致第一个事物两次读取的数据可能会不一样,这就称为不可重复读。
- 幻读(Phantom read):幻读和不可重复读很类似,它发生在一个事物读取了几行数据,接着另一个并发事物插入了一些数据时。在随后的查询中,第一个事物就会发现多了一些原本不存在的记录,就好像出现了幻觉一样,故被称为幻读。