MariaDB SQL 管理事物处理

表单


  1. customers表:客户。
  2. orders表:客户的订单。
  3. orderitems:存储订单订购的各种物品。

情景(没有使用事务)


  1. 检查客户是否在数据库(即在customers表中)。如果没有,添加该客户。
  2. 检索客户id。
  3. 添加一行到orders表中。将它关联到客户ID。
  4. 检索orders表中新订单的ID。
  5. 对每个订购的物品,添加一行到orderitems表中,通过检索到的ID将其关联到orders表。

问题


假设产生了一些数据库故障或者其他原因导致数据库故障,让这个完整的步骤无法完成。

故障发生在:

  1. 客户添加之后,并且在表单添加之前。这样的情况是允许出现的,因为客户没有订单是合法的。
  2. orders行添加之后,且在添加orderitems行之前。数据库将有一个空的订单。
  3. 添加orderitems行的时候。数据库将产生一个不完整的订单。

 

什么是数据库事务?


 

  1. 数据库事务:一个有限的数据库操作序列构成。(维基百科)
  2. 事务(Transaction)——一组SQL语句。(《MariaDB SQL》)
  3. 事务处理(Transaction processing):管理数据库操作集合的一种机制,它保证批处理完成,以保证数据库永远不会包含部分操作的结果,即要么全部都执行,要么完全不执行。(《MariaDB SQL》)

 

如何处理?(使用事务)


  1. 检查客户是否在数据库中。如果没有,添加该客户。
  2. 提交客户信息。
  3. 检索客户ID。
  4. 添加一行到orders表中。
  5. 如果添加行到orders表时发生故障,则回滚(roll back)。
  6. 检索orders表中新订单的ID。
  7. 对每个订购的物品,添加一行到orderitems表中。
  8. 如果在添加行到orderitems时发生错误,回滚所有已添加的ordertimes行和orders行。
  9. 提交订单信息

 

其他概念


  • 回滚(Rollback):撤销指定SQL语句的处理过程。
  • 提交(Commit):将还未保存的数据库语句写入数据库表。
  • 保存点(Savepoint):事务集中的一个临时占位符,可进行回滚。

 

 

部分代码:

SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotales;
SELECT * FROM ordertotales;
ROLLBACK;
SELECT * FROM ordertotals;

 

SAVEPOINT delete1;
ROLLBACK TO delete1;

 

设置MariaDB不能自动提交:

SET autocommit=0;

 

 

待续的更主要的主题


 

1.数据库最重要的核心是什么?

2.数据库完整性

3.数据库事务拥有四个特性,习惯上被称之为ACID特性

4.什么是死锁?乐观锁?悲观锁?

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。