教程 > sql 教程 > 阅读:24

sql transaction(事务)——迹忆客-ag捕鱼王app官网

事务是针对数据库执行的工作单元。事务是按逻辑顺序完成的工作单元或序列,无论是由用户手动完成还是由某种数据库程序自动完成。

事务是对数据库的一个或多个更改的传播。例如,如果你正在创建记录或更新记录或从表中删除记录,则表示你正在对该表执行事务。控制这些事务以确保数据完整性和处理数据库错误非常重要。

实际上,我们会将许多 sql 查询组合到一个组中,并将所有这些查询作为事务的一部分一起执行。

事务属性

事务具有以下四个标准属性,通常由首字母缩写词acid 表示。

  • 原子性- 确保工作单元内的所有操作都成功完成。否则,事务将在故障点中止,并且所有先前的操作都将回滚到它们之前的状态。
  • 一致性- 确保数据库在成功提交的事务后正确更改状态。
  • 隔离性- 使事务能够独立运行且多个事务之间彼此透明。
  • 持久性- 确保在系统故障的情况下提交的事务的结果或影响仍然存在。

事务控制

以下命令用于控制事务。

  • commit - 提交更改。
  • rollback - 回滚更改。
  • savepoint - 在要回滚的事务组中创建点。
  • set transaction - 给事务设置一个名称。

事务控制命令

事务控制命令仅与dml 命令一起使用,例如 - insert、update 和 delete。在创建表或删除表时不能使用它们,因为这些操作是在数据库中自动提交的。

commit 命令

commit 命令是用于将事务调用的更改保存到数据库的事务命令。commit 命令将自上次 commit 或 rollback 命令以来的所有事务保存到数据库中。

commit 命令的语法如下。

commit;

示例

customers 表数据记录如下:

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  32 | ahmedabad |  2000.00 |
|  2 | khilan   |  25 | delhi     |  1500.00 |
|  3 | kaushik  |  23 | kota      |  2000.00 |
|  4 | chaitali |  25 | mumbai    |  6500.00 |
|  5 | hardik   |  27 | bhopal    |  8500.00 |
|  6 | komal    |  22 | mp        |  4500.00 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 

下面是一个示例,它将从表中删除那些 age = 25 的记录,然后提交数据库中的更改。

sql> delete from customers
   where age = 25;
sql> commit;

因此,表中的两行数据将被删除,select 语句查询结果如下。

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  32 | ahmedabad |  2000.00 |
|  3 | kaushik  |  23 | kota      |  2000.00 |
|  5 | hardik   |  27 | bhopal    |  8500.00 |
|  6 | komal    |  22 | mp        |  4500.00 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 

rollback 命令

rollback 命令是用于撤消尚未保存到数据库的事务的事务性命令。此命令只能用于撤消自上次发出 commit 或 rollback 命令以来的事务。

rollback 命令的语法如下

rollback;

示例

customers 表数据记录如下:

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  32 | ahmedabad |  2000.00 |
|  2 | khilan   |  25 | delhi     |  1500.00 |
|  3 | kaushik  |  23 | kota      |  2000.00 |
|  4 | chaitali |  25 | mumbai    |  6500.00 |
|  5 | hardik   |  27 | bhopal    |  8500.00 |
|  6 | komal    |  22 | mp        |  4500.00 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 

以下示例将从表中删除那些 age = 25 的记录,然后回滚数据库中的更改。

sql> delete from customers
   where age = 25;
sql> rollback;

因此,删除操作不会影响表,select 语句查询结果如下。

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  32 | ahmedabad |  2000.00 |
|  2 | khilan   |  25 | delhi     |  1500.00 |
|  3 | kaushik  |  23 | kota      |  2000.00 |
|  4 | chaitali |  25 | mumbai    |  6500.00 |
|  5 | hardik   |  27 | bhopal    |  8500.00 |
|  6 | komal    |  22 | mp        |  4500.00 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 

savepoint 命令

savepoint 是在事务中创建一个点,这样我们就可以将事务回滚到某个点而不用回滚整个事务。

savepoint 命令的语法如下所示。

savepoint savepoint_name;

此命令仅用于在所有事务性语句中创建一个点。rollback 命令用于撤消一组事务。

回滚到 savepoint 的语法如下所示。

rollback to savepoint_name;

以下是计划从 customers 表中删除三个不同记录的示例。我们希望在每次删除之前创建一个 savepoint,以便可以随时回滚到任何 savepoint 以将相应的数据返回到其原始状态。

示例

customers 表数据记录如下所示。

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  32 | ahmedabad |  2000.00 |
|  2 | khilan   |  25 | delhi     |  1500.00 |
|  3 | kaushik  |  23 | kota      |  2000.00 |
|  4 | chaitali |  25 | mumbai    |  6500.00 |
|  5 | hardik   |  27 | bhopal    |  8500.00 |
|  6 | komal    |  22 | mp        |  4500.00 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 

以下代码块包含一系列操作。

sql> savepoint sp1;
savepoint created.
sql> delete from customers where id=1;
1 row deleted.
sql> savepoint sp2;
savepoint created.
sql> delete from customers where id=2;
1 row deleted.
sql> savepoint sp3;
savepoint created.
sql> delete from customers where id=3;
1 row deleted.

既然三个删除操作已经执行,现在假设我们已经改变主意并决定回滚到确定为 sp2 的 savepoint。因为 sp2 是在第一次删除后创建的,所以最后两次删除被撤消

sql> rollback to sp2;
rollback complete.

请注意,回滚到 sp2 后,只有第一次删除生效了。

sql> select * from customers;
 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  2 | khilan   |  25 | delhi     |  1500.00 |
|  3 | kaushik  |  23 | kota      |  2000.00 |
|  4 | chaitali |  25 | mumbai    |  6500.00 |
|  5 | hardik   |  27 | bhopal    |  8500.00 |
|  6 | komal    |  22 | mp        |  4500.00 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 
6 rows selected.

release savepoint 命令

release savepoint 命令用于删除我们创建的 savepoint。

release savepoint 命令的语法如下。

release savepoint savepoint_name;

一旦 savepoint 被释放,就不能再使用 rollback 命令来撤消自上次 savepoint 以来执行的事务。

set transaction 命令

set transaction 命令可用于启动数据库事务。此命令用于开启一个事务,并设置事务的属性。例如,我们可以将事务指定为只读或读写。

set transaction 命令的语法如下。

set transaction [ read write | read only ];

查看笔记

扫码一下
查看教程更方便
网站地图