事务(transaction)是由一些列操做序列构成的执行单元,这些单元要么都作,要么不作,是一个不可分割的工做单元。数据库
事务的四种特性:原子性、一致性、分离性、持久性。并发
原子性:指的是事物中包含的全部操做要么全作,要么全不作。spa
一致性:在事物开始之前,数据库处于一致性的状态,事物结束后,数据库也必须处于一致性的状态。事务
分离性:指并发的事务是相互隔离的。即一个事务内部的操做及正在操做的数据必须封锁起来,不被其它企图进行修改的事务看到。io
持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性经过数据库备份和恢复来保证。class
事务处理有两种:1.数据库事务 2.Spring事务(咱们通常都用Spring处理事务)date
数据库事务级别有3中:分别是幻读、不可重复读和脏读。数据
幻读(读取时,插入):事务T1进行查询操做返回了一个结果集,事务T2此时进行了insert操做,刚好知足事务T1的要求,此时T1并查询一遍,返回的结果集和第一次返回的结果集不一样。查询
不可重复读(读取时,有更新):事务T1进行查询操做返回了一个结果集,事务T2此时进行了update操做,事务T1再查询一遍,两个返回的结果集不一致。di
脏读(更新后读取):事务T1进行了insert/update操做,未提交。事务T2进行查询返回了一个结果集,此时T1进行了回滚,T2读到的其实就是无效的脏数据了。
数据库事务隔离级别有如下四种:
READ UNCOMMITTED 幻想读、不可重复读和脏读都容许。
READ COMMITTED 容许幻想读、不可重复读,不容许脏读
REPEATABLE READ 容许幻想读,不容许不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不容许
OracleOracle不支持脏读,因此数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。
SQL标准所定义的默认事务隔离级别是SERIALIZABLE,可是Oracle 默认使用的是READ COMMITTED,MySql的默承认重复读取(REPEATABLE READ);
设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]