1、事务:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
2、事务的特性:
原子性:事务不可分割;
一致性:事务执行前后,数据的完整性保持一致;
隔离性:一个事务的执行不应该受到其他事务的干扰;
持久性:一旦事务结束,数据就持久化到数据库。
3、如果不考虑隔离性,就会引发的安全性问题,例如:
读问题:
(1)、脏读 :一个事务读到了另一个事务正在修改但尚未提交到数据库的数据;
脏读又称无效数据的读出,是指在数据库访问中,T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
(2)、不可重复读 :是指在数据库访问中,一个范围内两个相同的查询却返回了不同数据。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
(3)、虚读、幻读:一个事务读到另一个事务insert到数据库的数据,导致该事务多次查询结果不一致。例如:Transaction1读取满足某种搜索条件的一些行,然后Transaction2插入了符合Transaction1的搜索条件的一个新行。如果Transaction1重新执行产生原来那些行的查询,就会得到不同的行。
(4)、丢失更新:两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
4、为了避免上面出现的几种情况,在标准规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
Read uncommitted:未提交读,任何读问题都解决不了。
Read committed: 已提交读,解决脏读,不可重复读和虚读可能发生。(oracle)
Repeatable read: 重复读,解决脏读和不可重复读,但是虚读有可能发生。(mysql)
Serializable : 解决所有读问题。非常安全,但是效率非常低。提供严格的事务隔离。它要求事务执行,事务只能一个接着一个地执行,不能并发执行。
因此,隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。