Oracle TCL

TCL语言

事务

一、含义

一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行

二、特点(ACID)

  1. 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
  2. 一致性:一个事务的执行不能破坏数据库数据的完整性和一致性
  3. 隔离性:一个事务不受其它事务的干扰,多个事务是互相隔离的
  4. 持久性:一个事务一旦提交了,则永久的持久化到本地

三、分类

1
2
3
4
5
6
7
8
9
10
11
12
13
1、开启事务
Oracle 11g中事务是隐式自动开始的,它不需要用户显示的执行开始事务语句

2、编写一组逻辑sql语句
注意:sql语句支持的是insertupdatedelete

【设置回滚点】
savepoint 回滚点名;

3、结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方: rollback to 回滚点名;

事务并发(读问题)

一、事物的并发问题如何发生?

多个事务同时操作同一个数据库的相同数据时

二、事务的并发问题都有哪些?

  1. 脏读:一个事务读到了另一个事务还未提交的update数据,导致多次查询的结果不一样(Oracle中不会产生)

  2. 不可重复读:一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致

  3. 幻读:一个事务读到了另一个事务已经提交的insert数据,导致多次查询的结果不一样

三、事物的并发问题如何解决?

通过设置隔离级别来解决并发问题

四、隔离级别

Oracle中只支持READ COMMITTED、SERIALIZABLE、READ ONLY、READ WRITE,这些语句是互斥的,不能同时设置两个或两个以上的选项,一般默认即可。

丢失更新(写问题)

一、定义

在事务的隔离级别内容中,能够了解到两个不同的事务在并发的时候可能会发生数据的影响。细心的话可以发现事务隔离级别章节中,脏读、不可重复读、幻读三个问题都是由事务A对数据进行修改、增加,事务B总是在做读操作。如果两事务都在对数据进行修改则会导致另外的问题:丢失更新。

二、解决

  1. 悲观锁:认为两个事务更新操作一定会发生丢失更新

    • 解决:通过在语句后边添加for update来实现行级上锁,所以又称为“行级锁”,例如:select * from t_account t wheret.id=‘1’ for update;
  2. 乐观锁:认为事务不一定会产生丢失更新,让事务进行并发修改,不对事务进行锁定

    • 解决:由程序员自己解决,可以通过给数据表添加自增的version字段或时间戳timestamp,进行数据修改时,数据库会检测version字段或者时间戳是否与原来的一致,若不一致,抛出异常或者重新查询

三、注意

对于账户交易建议直接使用悲观锁,数据库的性能很高,并发度不是很高的场景两者性能没有太大差别。如果是交易减库存的操作可以考虑乐观锁,保证并发度。


Oracle TCL
https://flepeng.github.io/042-Oracle-22-命令-Oracle-TCL/
作者
Lepeng
发布于
2025年3月22日
许可协议