什么是事务?
事务是一组SQL语句,这些语句要么全部执行成功,要么全部不执行。事务的主要目的是确保数据库的完整性,并保证一组操作要么完全完成,要么完全不进行,不会出现部分执行的情况。
事务的特性
事务具有四个重要的特性,通常称为ACID属性:
- 原子性(Atomicity):事务被视为不可分割的工作单元,事务中的所有操作要么全部执行,要么一个都不执行。
- 一致性(Consistency):事务将数据库从一个一致状态转换到另一个一致状态。一致性还要求事务执行前后数据保持一致,如转账后总金额不变。
- 隔离性(Isolation):事务并发执行时,一个事务的执行不应影响其他事务。这意味着事务执行的结果不受其他事务的影响。
- 持久性(Durability):一旦事务提交,其结果就应该是永久性的。即使系统发生故障,已提交的事务也应该保持结果不丢失。
事务控制语句
开始事务
在MySQL中,可以使用START TRANSACTION;
或者BEGIN;
来开始一个新的事务。
START TRANSACTION; -- 或者 BEGIN;
提交事务
事务完成后,需要使用COMMIT;
来提交事务,这样所有对数据库的操作才会被永久保存。
COMMIT;
回滚事务
如果事务在执行过程中遇到错误或需要撤销操作,可以使用ROLLBACK;
来回滚事务,撤销所有未提交的更改。
ROLLBACK;
设置保存点
MySQL允许你在事务中设置保存点,这样可以在事务的不同阶段进行部分回滚。
SAVEPOINT savepoint_name;
然后可以通过回滚到特定的保存点来恢复事务的一部分。
ROLLBACK TO SAVEPOINT savepoint_name;
最后,也可以删除保存点。
RELEASE SAVEPOINT savepoint_name;
事务的隔离级别
为了处理并发事务带来的问题,MySQL提供了四种隔离级别,每种级别对应不同的并发控制策略:
- 读未提交(Read Uncommitted):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- 读已提交(Read Committed):允许读取已完成的数据变更,每个查询只能看到已经提交的数据,解决了脏读的问题,但可能会导致不可重复读和幻读。
- 可重复读(Repeatable Read):这是MySQL的默认隔离级别,在这个级别下,事务在启动后的任何时刻看到的数据都是一致的,解决了脏读和不可重复读的问题,但可能会导致幻读。
- 串行化(Serializable):最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。此级别会导致大量的锁定冲突,性能开销最大。
查看当前会话的隔离级别
SELECT @@tx_isolation; -- 或者 SELECT @@transaction_isolation;
设置当前会话的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
例如,设置为可重复读:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
事务的使用场景
事务在需要保证数据一致性和完整性的场合非常有用,比如银行转账、在线购物订单处理等。
示例:银行转账
假设我们有两个账户A和B,需要将A账户的100元转移到B账户。我们可以使用事务来确保这一过程的安全性:
START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE account_number = 'A'; UPDATE accounts SET balance = balance + 100 WHERE account_number = 'B'; COMMIT;
如果在这两步之间系统崩溃,那么事务将会回滚,保证了数据的一致性。
总结
事务是数据库管理的重要组成部分,能够确保数据的完整性和一致性。理解并正确使用事务控制语句和隔离级别对于开发健壮的应用程序至关重要。希望本章的内容能帮助大家更好地理解和应用MySQL事务。