数据库事务
1.事务概念
事务是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK操作结束,COMMIT为提交,提交事务中所有操作、事务正常结束。ROLLBACK即回滚,撤销已做的所有操作,回滚到事务开始时的状态。
2.事务的4个特性(ACID)
名称 | 简介 |
---|---|
原子性(Atomicity) | 所谓原子性是指事务在逻辑上是不可分割的操作单元,其所有语句要么都执行。要么都撤销执行。当时每个事务运行结束时,可以选择提交所做的数据修改,并将这些修改永久应用到数据库中 |
一致性(consistency) | 事务是一种逻辑上的工作单元,一个事务就是一系列在逻辑上相关的操作指令的集合,用于完成一项任务,基本质是将数据库中的数据从一种一致性状态转换到另一种一致性的状态,以体现现实世界中的状况变化。 |
隔离性(Isolation) | 隔离性是针对并发事务而言的,所谓并发是指数据库服务器同时处理多个事务,如果不采取专门的控制机制,那么并发事务之间可能会相互干扰,进而导致据出现不一致或错误的状态。隔离性就是隔离并发运行的多个事务间的相互影响。 |
持久性(Durability) | 事务的持久性,是指一旦事务提交成功,其对数据的修改是持久性的。数据更新的结果已从内存转存到外部存储上,此后即使发生了系统故障,已经提交事务所做的数据更新也不会丢失。 |
3.事务的常见分类
-
扁平事务
最简单的事务,所有操作处于同一层次,由Begin work开始,由COMMIT WORK或ROLLBACK
WORK结束,其间的操作是原子的,要么都执行,要么都回滚。
保存点(SAVEPOINT)用来通知事务系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态。
扁平事务一般三种不同的结果:
事务成功完成
应用程序要求停止事务
外界因素强制停止事务
-
带有保存点的扁平事务
事务除支持扁平事务支持操作外,还允许在事务执行过程中回滚到同一事务中较早的一个状态。
-
链接事务
- 一个事务由多个子事务链式组成。在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务,前一个子事务的提交操作和下一个子事务的开始操作合并成一个原子操作,这意味着下一个事务将看到上一个事务的结果,就好像在一个事务中进行一样。
-
嵌套事务
-
分布式事务
4.XA事务
5.事务隔离级别
事务并发发生的问题:
现象 | 简介 |
---|---|
脏读 | 一个事务读取了已被另一个事务修改但尚未提交的数据。 |
不可重复读 | 在同一个事务中,同一个查询在TIME1时刻读取某一行,在TIME2时刻重新读取这一行数据时候,发现这一行的数据已经发生修改,可能被更新,也可以被删除 |
幻读 | 在同一个事务中,当同一查询多次执行的时候,由于其他插入的事务提交,会导致每次返回不同的结果集。 |
事务的4种隔离级别:
-
READ UNCOMMITTED
-
READ COMMITTED
-
REPEATABLE READ
-
Serializable
隔离级别 | READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE |
---|---|---|---|---|
脏读 | 允许 | |||
不可重复读 | 允许 | 允许 | ||
幻读 | 允许 | 允许 | 允许 | |
默认级别数据库 | ORACLE,SQLSERVER | Mysql | ||
并发性能 | 最高 | 比READ UNCOMMITTED低 | 比READ Committed 低 | 最低 |
ORACLE,MYSQL,SQLSERVER中事务隔离级别分别有哪些
oracle | mysql | sqlserver | |
---|---|---|---|
支持 | READ COMMITTED,SERIALIZABLE | READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ ,SERIALIZABLE | READ UNCOMMITTED,READCOMMITED,REPEATABLE READ,SERIALIZABLE,SNAPSHOT,READ COMMITTED SNAPSHOT |
默认 | READ COMMITTED | Repeatable READ | Read Committed |
set transaction isolation level read committed/read uncommitted/repeatable read/seriailizable. --设置隔离级别 alter database test set ALLow_snapshot_isolation on;设置快照 alter database test set READ committed_snapshot on --设置已经提交读快照级别 |
ORACLE 设置隔离级别语句:
set transaction isolation level read committed;
set transaction isolation level serializable ;--(SYS用户不支持SERIALIZABLE)
ORACLE 查询隔离别语句:
select s.sid,s.serial#,
case bitand(t.flag,power(2,28))
when 0 then 'READ COMMITTED'
else 'SERIALIZABLE'
end as isolation_level
from v$transaction t inner join
v$session s
on t.addr=s.taddr and s.sid=sys_context('USEREVN','SID');
MYSQL 设置隔离级别语句:
set global}session transaction isolation level read committed;
set global}session transaction isolation level read uncommitted;
set global}session transaction isolation level Repeatable Read;
set global}session transaction isolation level serializable;
MYSQL 查询事务隔离级别的SQL:
select @@TX_ISOLATION; --查询当前会话隔离级别
select @@GLOBAL TX_ISOLATION;---查询系统事务隔离级别
SELECT @@GLOBAL TX_ISOLATION,@@TX_ISOLATION --同时查询
SQLSERVER 设置事务隔离级别的SQL:
set transaction isolation level read committed;
set transaction isolation level read uncommitted;
set transaction isolation level repeatable read;
set transaction isolation level serializable;
alter database test set ALLow_snapshot_isolation on;设置快照
alter database test set READ committed_snapshot on --设置已经提交读快照级别
SQL SERVER 查询隔离级别
DBCC USEROPTIONS