表单
- customers表:客户。
- orders表:客户的订单。
- orderitems:存储订单订购的各种物品。
情景(没有使用事务)
- 检查客户是否在数据库(即在customers表中)。如果没有,添加该客户。
- 检索客户id。
- 添加一行到orders表中。将它关联到客户ID。
- 检索orders表中新订单的ID。
- 对每个订购的物品,添加一行到orderitems表中,通过检索到的ID将其关联到orders表。
问题
假设产生了一些数据库故障或者其他原因导致数据库故障,让这个完整的步骤无法完成。
故障发生在:
- 客户添加之后,并且在表单添加之前。这样的情况是允许出现的,因为客户没有订单是合法的。
- orders行添加之后,且在添加orderitems行之前。数据库将有一个空的订单。
- 添加orderitems行的时候。数据库将产生一个不完整的订单。
什么是数据库事务?
- 数据库事务:一个有限的数据库操作序列构成。(维基百科)
- 事务(Transaction)——一组SQL语句。(《MariaDB SQL》)
- 事务处理(Transaction processing):管理数据库操作集合的一种机制,它保证批处理完成,以保证数据库永远不会包含部分操作的结果,即要么全部都执行,要么完全不执行。(《MariaDB SQL》)
如何处理?(使用事务)
- 检查客户是否在数据库中。如果没有,添加该客户。
- 提交客户信息。
- 检索客户ID。
- 添加一行到orders表中。
- 如果添加行到orders表时发生故障,则回滚(roll back)。
- 检索orders表中新订单的ID。
- 对每个订购的物品,添加一行到orderitems表中。
- 如果在添加行到orderitems时发生错误,回滚所有已添加的ordertimes行和orders行。
- 提交订单信息
其他概念
- 回滚(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.数据库完整性
4.什么是死锁?乐观锁?悲观锁?