一、事务
事务是一组操作的集合,集合里的所有操作要么全部执行成功,要么全部失败回滚。
二、事务的特征(ACID)
1、原子性(Atomicity)
事务所包含的操作,要么全部执行成功,要么全部失败回滚。
2、隔离性(Isolation)
多用户访问数据库时,多个并发事务,之间的操作,需要相互隔离。
每个事务需要有,独立的数据空间,一个事务所做的修改,必须与,其他任何事务所做的修改,隔离
比如操作同一张表,数据库为每一个用户开启的事务,不能被其他的事务的操作所干扰。
3、一致性(Consistency)
事务,在提交之前和提交之后,都必须处于,一致性状态。
一致性状态,例如,两个用户不管如何相互转账,账户的钱的总和是一致的。
4、持久性(Durability)
事务一旦提交,并且提示操作完成,对数据库中,数据的改变,是持久性的。
即便这时数据库遇到了故障,也必须,将我们的事务,完全执行完成。
三、事务的隔离级别(UCRS)
事务的隔离级别按从低到高依次为:读未提交、读已提交、可重复读、可串行化。
1、读未提交(Read Uncommitted)
一个事务,能够读到,其他事务,未提交的修改。
一个事务读到了另一个事务未提交的操作,而之后另一个事务回滚,则会引起赃读。
2、读已提交(Read Committed)
一个事务,所做的修改,只有在提交之后,才能被其他事务访问。
可以避免赃读。
一个事物两次读取同一份数据时,如果中间有其他事务的提交对该数据进行了修改,则会造成不可重复读。
3、可重复读(Repeated Read)
在同一个事务的处理过程中,多次读取,同一份数据,的结果总是相同的,不管其他事务是否提交。
可以避免赃读,不可重复读。
相当于在事务开始时对所操作的数据进行了快照,那么其他事务即便改变这部分数据,本事物读取的快照数据并没有改变。如果一个事务对一个表中的所有数据进行了修改,同时其他事务插入了新的数据,那么在本事务看来,新插入的数据并没有被修改,因此产生幻读。
4、串行读/顺序读(Serialization)
多个事务只能以串行方式执行,不能并发执行。
是最高的隔离级别,可以解决并发引起的所有问题,但是牺牲了并发性。
四、数据的不一致性
并发操作可能破坏事务的隔离性,带来的数据不一致性包括三类:赃读、不可重复读、幻读。
(1)赃读(Dirty Read)—— 可能发生的隔离级别:读未提交的事务
脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚。
(2)不可重复读 (Unrepeatable Read)—— 可能发生的隔离级别:读提交的事务、读未提交的事务
不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变。
(3)丢失修改/幻读(phantom read)—— 可能发生的隔离级别:不可重复读、读已提交的事务、读未提交的事务
幻读,是指当事务不是独立执行时发生的一种现象。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。对新插入的数据没有进行修改。
五、设置隔离级别
1、oracle 默认的隔离级别是 read committed。
oracle有两种隔离级别:read committed、serialization
(1)设置一个事务的隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
(2)设置整个会话的隔离级别
ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
2、mysql 默认的隔离级别为 Repeated Read(mysql 有四种隔离级别。)
开启事务,拷贝源
读时读事务,可重复读
写时加锁读源,写已提交
提交事务,提交修改释放锁