事务(transaction)是由一些列操作序列构成的执行单元,这些单元要么都做,要么不做,是一个不可分割的工作单元。
事务的四种特性:原子性、一致性、分离性、持久性。
原子性:指的是事物中包含的所有操作要么全做,要么全不做。
一致性:在事物开始以前,数据库处于一致性的状态,事物结束后,数据库也必须处于一致性的状态。
分离性:指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。
事务处理有两种:1.数据库事务 2.Spring事务(我们一般都用Spring处理事务)
数据库事务级别有3中:分别是幻读、不可重复读和脏读。
幻读(读取时,插入):事务T1进行查询操作返回了一个结果集,事务T2此时进行了insert操作,恰好满足事务T1的要求,此时T1并查询一遍,返回的结果集和第一次返回的结果集不同。
不可重复读(读取时,有更新):事务T1进行查询操作返回了一个结果集,事务T2此时进行了update操作,事务T1再查询一遍,两个返回的结果集不一致。
脏读(更新后读取):事务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]