一、什么是事务
1.1 概念
事务(transaction),将一组SQL语句放在同一批次内执行,他们要么都执行,要么都不执行
1.2 特点
一个事务中如果有一个数据库操作失败,那么整个事务中所有的数据库操作都会失败,数据库数据就会回滚 到该事务开始之前的状态。
1.2 限制
MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务
二、事务的ACID原则
2.1 原子性(Atomic)
事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。这意味着事务中的操作是不可 分割的,它们被当作一个整体来执行。
2.2 一致性(Consist)
事务必须保证数据库从一个一致的状态转移到另一个一致的状态。即 在事务开始之前和事务结束之后,数 据库的完整性约束都应该保持一致。
2.3 隔离性(Isolated)
并发执行的事务之间不会互相影响。MySQL提供了不同的隔离级别来定义事务隔离性的范围,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
2.4 持久性(Durable)
一旦事务提交,则其所做的修改会永久保存在数据库中,即使系统发生故障也不会丢失。
三、MySQL事务的使用
开始事务:可以通过START TRANSACTION或BEGIN语句来明确地开始一个事务。 提交事务:通过COMMIT语句来提交事务,使所有的更改永久生效。 回滚事务:如果事务中的操作需要撤销,可以使用ROLLBACK语句来撤销当前事务所做的所有更改 示例1: -- 开始事务 START TRANSACTION; -- 执行一些操作,例如插入数据 INSERT INTO table_name (column1, column2) VALUES (value1, value2); -- 提交事务 COMMIT; -- 如果发生错误,可以回滚事务 ROLLBACK;
示例2:
- 事务的操作
-- 1. 关闭自动提交
set autocommit = 0;
-- 2. 开始事务
start transaction;
-- 3. 一组sql语句
update bank set bmoney = bmoney-1000 where bname="李云'';
update bank set bmoney = bmoney+1000 where bname=''王风“”;
-- 4. 结束事务(判断)
-- 提交
commit;
-- 回滚
rollback;
-- 5. 开启自动提交
set autocommit = 1;
四、事务的隔离级别
4.1 读未提交(Read Uncommitted)
最低级别,允许读取未提交的数据,可能会导致脏读。
4.2 读已提交(Read Committed)
只允许读取已经提交的数据,可以避免脏读,但可能会出现不可重复读。
4.3 可重复读(Repeatable Read)
确保在同一事务中多次读取同一数据的结果是一致的,但可能会出现幻读。
4.4 串行化(Serializable)
最高级别,完全串行执行事务,避免了脏读、不可重复读和幻读,但可能导致性能问题。 注:MySQL的默认事务隔离级别是可重复读(Repeatable Read),但这个级别在某些存储引擎(如 InnoDB)中的行为更接近于串行化。