事务和锁是两个联系非常紧密的概念,它们保证了数据库的一致性。由于数据库是一个可以由多个用户共享的资源,因此当多个用户并发的存取数据时,就要保证数据的准确性。事务和锁就完成了这项功能。
什么是事务
事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内的语句都会被看成一个单元,一旦有一个失败,所有的都会失败。
事务就是一组包含一条或多条语句的逻辑单元,没个事务都是一个原子单位,在事务中的语句被作为一个整体,要么一起被提交,作用在数据上,使数据库数据永久的修改,要么一起被撤销,对数据库不做任何修改。
对于这个问题比较经典的例子就是银行账户间的回馈操作。
- 源账户减少存储金额,例如减少1000
- 目标账户增加存储金额,增加1000
- 在事务日志中记录该事务
整个交易过程,我们看做一个事务,如果操作失败,那么事务就会回滚,所有操作就会撤销。
事务在没有提交之前可以回滚,而且在提交前用户可以查看已经修稿的数据,但其他用户查看不到该数据,一旦数据提交就不能再撤销修改了。Oracle的事务基本控制语句有如下几个:
- SET TRANSACTION: 设置事务的属性
- COMMIT 提交事务
- SAVEPOINT 设置保存点
- ROLLBACK 回滚事务
- ROLLBACK TO SAVEPOINT 回滚至保存点
事务的类型
显示方式:利用命令去完成
新事务的开始
sql statement
...
COMMIT | ROLLBACK;
隐式方式:该类型没有明确的开始和结束,它由数据库自动开启,当一个程序正常结束或使用DDL语言时会自动提交,而操作失败时也会自动回滚,如果设置AUTOCOMMIT为打开状态,每次DML操作都会自动提交。
SET AUTOCOMMIT ON/OFF
事务的保存点
在事务中可以根据自己的需要设置保存点,保存点可以设置在事务中的如何地方,也可以设置多个点,这样就可以把比较长的事务根据需要分成较小的段。一旦把事务回滚到某个保存点后,Oracle将把保存点之后 持有的锁释放掉,这时先前等待被锁资源的事务就可以继续了。而使事务回滚到保存点,有几点需要了解
- 事务只回滚保存点之后的操作
- 回滚到某保存点时,它一行的保存点将被删除,但保存点会被保留
- 保存点之后的锁将被释放,但之前的会被保留
INSERT INTO PRODUCTINFO VALUES('1','保存点测试1',1000,0,00000000,NULL,'测试');
SAVEPOINT FST;
INSERT INTO PRODUCTINGO VALUES('1','保存点测试2',1000,0,00000000,NULL,'测试');
ROLLBACK FST;
事务的ACID特性
- 原子性:不可分割,是一个整体,同时成功和撤销
- 一致性:事务执行前后数据库都必须处于一致性状态,只有在事务完成后才能被所有使用者看见
- 分离性:事务之间不能互相的干扰
- 持久性:持久性是指一旦事务提交完成,对数据库就是永久的修改
tips:事务提交很重要,但不建议频繁的提交事务,因为每次提交事务都需要时间。