首页 > 数据库 >无涯教程-SQL - Transactions(事务)

无涯教程-SQL - Transactions(事务)

时间:2024-01-16 15:31:56浏览次数:40  
标签:+----+----------+-----+-----------+----------+ 25 事务 Transactions SAVEPOINT 无涯 

事务是将一个或多个更改打包在一起保存到数据库,事务对于确保数据完整性和处理数据库错误很重要。

事务性质

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

  • 原子性 - 确保工作单元内的所有操作均成功完成,否则,事务将在失败时中止,并且所有先前的操作都将还原到以前的状态。

  • 一致性 - 确保成功提交事务后数据库正确更改状态。

  • 隔离性 - 使事务能够独立运行并且彼此透明。

  • 持久性 - 确保在系统故障的情况下持久化已提交事务的输出或效果。

事务控制

以下命令用于控制事务。

  • COMMIT                         - 提交事务。

  • ROLLBACK                     - 回滚事务。

  • SAVEPOINT                    - 在要进行回滚的事务组内创建点。

  • SET TRANSACTION   - 在事务中设置名称。

COMMIT命令

COMMIT命令是用于将事务调用的更改保存到数据库的事务性命令。

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 | Learnfk    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

下面是一个示例,该示例将从表中删除年龄为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 | Learnfk    |  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 | Learnfk    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

下面是一个示例,该示例将从表中删除年龄为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 | Learnfk    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

SAVEPOINT 命令

当您可以将事务回滚到特定点而不回滚整个事务时,SAVEPOINT是事务中的一个点。

SAVEPOINT命令的语法如下所示。

SAVEPOINT SAVEPOINT_NAME;

该命令仅在所有事务语句之间创建SAVEPOINT时起作用, 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 | Learnfk    |  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 | Learnfk    |  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 ];

参考链接

https://www.learnfk.com/sql/sql-transactions.html

标签:+----+----------+-----+-----------+----------+,25,事务,Transactions,SAVEPOINT,无涯,
From: https://blog.51cto.com/u_14033984/9272819

相关文章

  • SqlSugar的Where用法
    1、普通表达式查询//id=@idvar list=db.Queryable<Student>().Where(it => it.Id == id).ToList(); //多个条件var list2=db.Queryable<Student>().WhereIF(id>0,it => it.Id == id)// 如果id>0 添加条件 id=@id  .WhereIF(name!=null,it => it.nam......
  • SqlSugar的Select用法
    Select位置正常情况:应该在最后面,一般是.Where(..).OrderBy(..).Select(..).ToList()特殊情况:如果Select不是最后一个位置,则Select要加MergeTable()合并成一个表,Select(...).MergeTable().Where语法糖:Select(...).MergeTable()在新版本中可以用SelectMergeTable(it=>newx......
  • SqlSugar跨库查询/多库查询
    一、跨库方式1:跨库导航(5.1.3.24)优点1:支持跨服务器,支持跨数据库品种,支持任何类型数据库 优点2:  超级强大的性能,能达到本库联表性能缺点:不支持子表过滤主表(方案有ToList后在内存过滤,如果分页可以查前1000条主表在内存分页前端只显示前10页)[Tenant("db2")] //......
  • SqlSugar新增数据
    1、插入方式1.1单条插入实体//返回插入行数db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现//异步: await db.Insertable(insertObj).ExecuteCommandAsync() //插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)db.Insertable(in......
  • SqlSugar更新数据
    1、根据实体对象更新所谓按实体对象更新就是:db.Updateable(参数对象)有参数的重载db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单优点1、代码少2、支持各种批量修改缺点1、不支持表达式和sql函数2、依赖 实体对象,没实体对象就需......
  • SqlSugar删除数据
    1、根据实体删除1.1强类型实体 需要配置主键,根据主键删除需要给实体配置主键,参考文档实体配置//单个实体db.Deleteable<Student>(new Student() { Id = 1 }).ExecuteCommand(); //List<实体> (可以不加Where)List<Student> list=new List<Student>(){......
  • SqlSugar基础查询
    查所有List<Student> list=db.Queryable<Student>().ToList()//select * from Student查询总数int count=db.Queryable<Student>().Count()//select count(1) from Student按条件查询db.Queryable<Student>().Where(it=>it.Id......
  • SqlSugar分组查询
    一、分组查询和使用1.1语法只有在聚合对象需要筛选的时候才会用到Having,一般分组查询用不到可以去掉  var list = db.Queryable<Student>()             .GroupBy(it => new { it.Id, it.Name }) //可以多字段             .Whe......
  • SqlSugar分页查询
    同步分页 int pagenumber= 1; // pagenumber是从1开始的不是从零开始的 int pageSize = 20; int totalCount=0; //单表分页 var page = db.Queryable<Student>().ToPageList(pagenumber, pageSize, ref totalCount); //如果SqlServer不想有Rownumb......
  • SqlSugar联表查询
    Join用法语法糖1、2和3在WhereOrderByGroupBySelect用法都一样的,他们区别就在JOIN的方式不一样,其它都一样语法糖1  优点:好理解,5个表以内的联表非常爽,支持功能全缺点: 联表超过5个以上的表后(x,b,c...) 会比较难看,语法糖2可以弥补表和表的左连接  新语法糖 5.0.......