MySQL学习--事务总结

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日志);

事务并发问题

  • 主要会产生以下三个问题:
问题问题描述
脏读一个事务读取了另外一个事务还没有提交的数据,该数据可能会被回滚;
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同(可能在两次读数据期间,该记录被其他事务修改了)
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据后,再次查询发现数据已经存在,类似“幻影”

事务隔离级别

  • 未完待续;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SEA-365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值