事务是数据库管理系统中一个重要的概念,用于确保数据的一致性和完整性。简单来说,事务是一系列数据库操作的集合,这些操作要么全部成功,要么全部失败。这样可以避免在处理过程中出现部分成功、部分失败的情况,从而保持数据的可靠性。
事务的四大特性(ACID)
-
原子性 (Atomicity):
- 事务中的所有操作要么全部执行成功,要么全部不执行。即使在中间出现错误,所有的操作都会被撤销,数据库会回到事务开始前的状态。
-
一致性 (Consistency):
- 事务执行前后,数据的完整性和一致性应该得到维护。事务的成功执行将使数据库从一种一致状态转变为另一种一致状态。
-
隔离性 (Isolation):
- 事务的执行是独立的,一个事务的执行不应受到其他事务的干扰。即使多个事务并发执行,每个事务的操作都应该与其他事务相互隔离。
-
持久性 (Durability):
- 一旦事务提交,其对数据库的修改是永久性的,即使系统崩溃或出现其他问题,这些修改也会持久保存。
使用事务的场景
-
批量插入或更新:
- 当需要在数据库中插入、更新多个记录时,使用事务可以确保要么所有记录都成功插入/更新,要么没有任何记录被修改。
-
转账操作:
- 在银行转账中,涉及到从一个账户扣款和向另一个账户存款,这两个操作需要在一个事务中完成,以确保不会出现只扣款或只存款的情况。
示例
假设你在一个电商平台上进行一次购买,涉及到以下操作:
- 从用户账户扣除金额。
- 向库存中减少商品数量。
- 插入订单记录。
如果执行的时候发生了错误,比如库存更新失败,而扣款成功,那么用户的账户就会少了一笔钱,而商品库存却没有减少,这显然是不一致的。
如果这些操作放在一个事务中,如果其中任何一步失败,所有的操作都会被撤回,确保状态一致。
代码示例
在使用 SQLite 或其他数据库访问库时,通常会有事务的支持,例如使用 BEGIN TRANSACTION
开始事务、COMMIT
提交事务和 ROLLBACK
撤销事务。以下是一个简单的示例,使用伪代码表示:
// 开始事务
[database beginTransaction];
@try {
// 执行多个数据库操作
[database executeUpdate:@"INSERT INTO orders ..."];
[database executeUpdate:@"UPDATE accounts SET balance = balance - ..."];
[database executeUpdate:@"UPDATE inventory SET quantity = quantity - ..."];
// 提交事务
[database commit];
} @catch (NSException *exception) {
// 出现错误时,撤销事务
[database rollback];
NSLog(@"Transaction failed: %@", exception);
}
在这个例子中,如果所有操作成功,事务会被提交;如果有任何错误发生,所有操作会被撤销,保持数据库状态的一致性。
标签:事务,database,要么,数据库,操作,执行 From: https://www.cnblogs.com/Tamako-/p/18471834