1.1.1. 事务特性(ACID)
原子性:一个事务是一个整体,不可再分割,要么同时成功,要么同时失败, 回滚。(把一组操作放入事务中)。
一致性:事务的执行的前后,数据的完整性要得到保证(数据的总量是不变的)。
隔离性:多个事务之间,互相独立,互不影响。
(强调的是多个用户并发访问数据库时,某个用户事务不能被其他用户的事务所干扰,多个并发事务之间的数据要相
互隔离。解决多个用户对同一个数据进行操作,数据库会有 事务的 隔离级别来进行解决)
持久性:当事务一旦被提交,它对数据库中的数据更改是永久性的。(即使数据库发生故障也不应该对其有任何影响)
1.1.2.并发事务带来的问题(脏读,不可重复读,幻读)
什么是脏数据?
脏读: 查询语句查到了一个事务,未提交的数据。
释义:指当一个事务正在访问数据,并且对数据进行了修改,而当前修改还没有提交到数据库,此时另外一个事务也访问这个数据,并且使用了该
数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的此数据,我们称之为脏数据,依据脏数据所做的操作可能是不正确的。
幻读: 一个事务在执行DML语句的同时,另一个事务也在执行DML语句,他们共同修改了同一表格中的数据。
释义:指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二
个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数
据行,就好象发生了幻觉一样。
不可重复读: 一个事务中,两次连续读取的结果不一致。
释义:指在一个事务内,多次读取同一数据的结果不一致。在这个事务还没有结束时,另外一个事务也访问该同一数据。 那么,在第一个事务中
的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据
是不一样的,因此称为是不可重复读。
1.1.3.事务的隔离级别
SQL 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会
导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻
读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务
自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执
行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻
读。