MySQL学习–事务总结
简介
- 一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败;
- 默认MySQL的事务是自动提交的,每个SQL语句都被视为一个单独的事务,并且在执行完该语句后就会立即提交到数据库中
事务操作
- 如果没有事务,看一个案例:银行转账
-- 1.查询张三账户的余额
SELECT money FROM account WHERE name = '张三';
-- 2.张三账户余额减100
UPDATE account set money = money - 100 WHERE name = '张三';
异常。。。 #此时,出现异常,张三的钱扣了100,但是李四的余额并没有加100;
-- 3.李四账户余额加100
UPDATE account set money = money + 100 WHERE name = '李四';
- 可能会出现上述情况,转账过程中出现异常,导致张三的钱扣了100,但是李四的余额并没有加100;
事务操作的两种控制方式
1.修改默认的事务提交方式
-- 1.修改默认提交方式
-- 查看当前会话事务的提交方式, 默认是1,表示自动提交模式;
SELECT @@autocommit;
-- 修改事务提交方式,0表示手动提交
-- 设置为手动提交时,当业务完成时,需要执行COMMIT操作提交,当业务出现异常时执行ROLLBACK操作回滚;
SET @@autocommit = 0;
-- 模拟银行转账
-- 1.查询张三账户的余额
SELECT money FROM account WHERE name = '张三';
-- 2.张三账户余额减100
UPDATE account set money = money - 100 WHERE name = '张三';
-- 3.李四账户余额加100
UPDATE account set money = money + 100 WHERE name = '李四';
COMMIT;
ROLLBACK;
2.使用MySQL语句控制
- 开启事务
START TRANSACTION;
或
BEGIN;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
- 案例
-- 2.MySQL语句控制
-- 开启事务
START TRANSACTION; # 使用BEGIN开启事务也可以;
-- 1.查询张三账户的余额
SELECT money FROM account WHERE name = '张三';
-- 2.张三账户余额减100
UPDATE account set money = money - 100 WHERE name = '张三';
sadasdad
-- 3.李四账户余额加100
UPDATE account set money = money + 100 WHERE name = '李四';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
事务四大特性ACID
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败;
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态;
- 例如,银行转账,张三扣了100,李四没有加100,就破坏了一致性;
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;
- 例如:给数据加锁,保证当前执行的事务不受其他事务的影响;
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;
- 例如:事务的业务完成后,所做的修改必须永久保存到数据库中,即使出现系统故障或崩溃,也不能丢失(这一点一般通过日志技术实现,如redo日志,undo日志);
事务并发问题
- 主要会产生以下三个问题:
问题 | 问题描述 |
---|---|
脏读 | 一个事务读取了另外一个事务还没有提交的数据,该数据可能会被回滚; |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同(可能在两次读数据期间,该记录被其他事务修改了) |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据后,再次查询发现数据已经存在,类似“幻影” |
事务隔离级别
- 未完待续;