2022-02-17 11:52:56
在 SQL 中,BEGIN 和 END 是用于定义事务边界的关键语句,确保数据库操作的原子性、持久性和隔离性。以下是详细说明:
核心功能事务定义
BEGIN 标记事务的起点,后续操作被纳入同一事务。
END 并非标准 SQL 语句,实际通过 COMMIT(提交)或 ROLLBACK(回滚)结束事务。
示例结构:BEGIN;-- 执行操作(如 INSERT/UPDATE/DELETE)COMMIT; -- 或 ROLLBACK;
原子性(Atomicity)
事务内的操作要么全部成功,要么全部失败。若中途出错,ROLLBACK 会撤销所有更改,保持数据一致性。
持久性(Durability)
COMMIT 后,更改永久保存,即使系统崩溃也不丢失。
隔离性(Isolation)
事务执行期间,其他会话无法看到中间状态,直到 COMMIT 完成,避免并发冲突。
显式事务控制
BEGIN;INSERT INTO orders (product, quantity) VALUES ('Laptop', 1);UPDATE inventory SET stock = stock - 1 WHERE product = 'Laptop';COMMIT; -- 确认提交-- 若出错则执行 ROLLBACK;隐式事务某些数据库(如 MySQL 的 autocommit=1)默认每条语句独立事务,需显式使用 BEGIN 关闭自动提交。
语法差异
MySQL/PostgreSQL 支持 BEGIN,而 SQL Server 使用 BEGIN TRANSACTION。
Oracle 默认无 BEGIN,直接通过 COMMIT/ROLLBACK 控制。
嵌套事务部分数据库支持嵌套(如 SQL Server 的 SAVEPOINT),但标准 SQL 不直接支持。
错误处理建议在应用程序中捕获异常并触发 ROLLBACK,例如:
BEGIN;-- 操作1-- 操作2(若失败则跳转到错误处理)COMMIT;EXCEPTION WHEN OTHERS THEN ROLLBACK;银行转账事务:
BEGIN;UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;-- 检查余额是否充足(伪代码)IF (SELECT balance FROM accounts WHERE user_id = 1) < 0 THEN ROLLBACK; -- 余额不足则回滚ELSE COMMIT; -- 成功则提交END IF;总结通过合理使用事务,可有效维护数据完整性和并发安全性。