事务:事务是需要在同一个处理单元中执行的一系列更新处理的集合。
事务处理的终止指令包括:commit 和 rollback
DBMS的事务具有 ACID 四种属性
原子性 atomicity
一致性 consistency
隔离性 isolation
持久性 durability
在RDBMS系统中,事务代表了对表中数据进行更新的单位
例如:在某公司的会议上,大家决定将a衬衫销售价格降低100元出售,b衬衫的销售价格上涨50元。正常逻辑就是写sql句子咯:
update clothes
set a_shirt_price = a_shirt_price - 100
where colthes_name = 'a_shirt';
update clothes
set b_shirt_price = b_shirt_price + 100
where colthes_name = 'b_shirt';
但是上述两个操作必须在同一个单元进行处理,任何一项操作被忘记,都会对公司造成影响。所以,事务就是解决上述问题的。
在DBMS系统的创建事务的语法,如下:
事务开始语句;
DML语句①(DML句子包括:INSERT、UPDATE、DELETE、SELECT DDL句子包括:CREATE、ALTER、DROP )
DML语句②
DML语句③
事务结束语句(commit rollback)
在标准的SQL中并没有定义事务的开始语句,而是由各个DBMS自己来定义的。比较有代表性的语法如下:
1、SQL Server、PostgreSQL
BEGIN TRANSACTION
2、MySQL
START TRANSACTION
3、Oracle、DB2
无
那么对应的,在demo中,该公司进行衬衫价格调整的sql句子在Oracle中就该是按照如下写法:
update clothes
set a_shirt_price = a_shirt_price - 100
where colthes_name = 'a_shirt';
update clothes
set b_shirt_price = b_shirt_price + 100
where colthes_name = 'b_shirt';
COMMIT;
补充事务隔离级别:
事务的隔离级别指的是一个事务对数据的修改 与另一个并行的事务的隔离程度,当多个事务同事访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下的问题:
1、脏读:-个事务读取到另一个事务未提交的更新数据。
2、幻读:指当事务不是独立执行时发生的一种现象,例如: 第一个事务对一个表中的数据进行了 修改,这种修改涉及到表中的全部行数据,同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据 ,就像发生了幻觉样。
3、不可重复读:在一个事务内,多次读取到同一数据。 在这个事务还没有结束时,另一个事务也访问了该同一数据。那么,在第一个事务中的两次读数据之间 ,由于第二个事务的修改,那么第一次事务两次读到的数据可能是不一样的。这样在一个事务内两次读到的数据是不一 样的,因此称为不可重复读。