数据库事务的四个基本要素(ACID)
1.原子性(A):事务的原子性是指事务是一个不可分割的工作单位,这组操作要么全部发生,否则全部不发生。发生错误就回滚。
2.一致性(C):在事务开始以前,被操作的数据的完整性处于一致性的状态,事务结束后,被操作的数据的完整性也必须处于一致性状态。比如转账:有5个账户,每个账户各有100元,5个就是500元。不管5个账户之间如何并发转账,5个账户的总额应该还是500元。
3.隔离性(I):事务隔离性要求系统必须保证事务不受其他并发执行的事务的影响。串行化,使得在同一时间仅有一个请求用于同一数据。
4.持久性(D):事务完成后,该事物对数据库所做的更改持久保存在数据库之中,不会被回滚。
事务的隔离级别
事务的隔离级别有四种,分别是 读未提交、读已提交、可重复读、序列化
隔离级别 脏读 不可重复读 幻读
读未提交 有 有 有
读已提交 否 有 有
可重复读 否 否 有
序列化 否 否 否
脏读:一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取不一致
幻读:例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
在MySQL数据库中,支持上面四种隔离级别,默认的为可重复读;而在Oracle数据库中,只支持Serializable (串行化)级别和读已提交这两种级别,其中默认的为读已提交级别。