数据库事务是一组作为逻辑工作单元执行的操作集合。它包括一个或多个SQL语句,数据库系统必须确保即使事务完全或部分失败,事务也能被正确执行。事务最常用于银行或交易行业。以下图文解释了事务处理过程:
考虑一个银行有两个客户,客户A和客户B。如果客户A希望将钱转给客户B,他或她有三种选择:
第一种情况表示事务成功,第二种情况较不重要,不需要重传,但第三种情况如果第一个操作成功而第二个操作因技术问题失败,将导致客户A账户被扣款而客户B账户未入账。这意味着将丢失数据。可以使用事务管理来解决所有这些问题。事务保证要么执行扣款或入账,要么什么都不执行。
事务控制机制使用以下命令:
BEGIN
:开始一个事务。COMMIT
:保存更改。提交命令后,事务不能回滚。SAVEPOINT
:提供事务可以回滚到的点。ROLLBACK
:回滚到之前保存的状态。以下是SQL中事务的一个示例:
-- 首先,创建一个表
SQL> create table student(
id int,
name varchar(15),
last_name varchar(15),
address varchar(20));
Table created.
-- 插入记录到学生表
SQL> insert into student values(1,'aarti','parekh','surat');
insert into student values(2,'uday','patel','valsad');
insert into student values(3,'om','parekh','bardoli');
insert into student values(4,'anjali','soni','ahmedabad');
insert into student values(5,'aarav','soni','baroda');
-- 检查记录是否已插入
SQL> select * from student;
-- 更新id为5的学生地址
SQL> update student set address='Ahmedabad' where id=5;
1 row is updated.
-- 提交更改
SQL> commit;
Commit Complete.
-- 创建保存点
SQL> savepoint s1;
Savepoint created.
-- 删除刚刚更新的记录
SQL> delete from student where id=5;
1 row was deleted.
-- 回滚到保存点s1
SQL> rollback to s1;
Rollback complete.
以上代码将撤销到保存点s1的所有更改,将得到创建保存点之前的原始表。这就是SQL中事务的工作方式。
事务由四个属性组成,也称为ACID规则。
原子性意味着事务必须被视为一个原子单元,这意味着它的所有操作要么全部执行,要么全部不执行。例如,考虑一个从账户P向账户Q转账100卢比的事务。在这个事务中,如果从账户A扣除了100卢比,那么它必须被加到账户B。
一致性意味着在任何事务之后,数据库必须保持一致性。如果数据库在事务之前是一致的,那么在事务完成后也必须是一致的。在示例中,P和Q的总和必须在事务执行之前和之后保持不变。
隔离性意味着一个事务中所做的更改在该事务提交之前对其他事务是不可见的。中间事务的结果必须对持续运行的事务隐藏。对于任何一对事务,一个应该在另一个完成后才开始执行。
持久性意味着事务完成后,它对数据库所做的更改是持久的(永久的),即使有系统故障也是如此。事务必须在完成最后一步后永久保存。如果系统失败,它不应该被消除。如果数据库丢失,恢复管理器负责确保数据库的长期可行性。必须每次在做出更改后使用COMMIT命令提交这些值。
调度是将事务合并为一个批次并以特定顺序执行的方法。它是系统中指令以时间顺序(顺序)执行的顺序。在数据库中,调度是必要的,因为当多个事务并行运行时,事务的结果可能会受到影响。这意味着如果一个事务更新了另一个事务访问的值,这两个事务执行的顺序将影响另一个事务的结果。因此,调度被用来执行事务。