Mysql(事务)
2023-12-14 05:39:17
Mysql(事务)
-
简介
-
是什么:一组操作的集合,不分割的工作单位,事务会把所有的操作作为一个整体,向数据库发起操作,要么全部失败要么全部成功。
-
案例:
-
银行转账
- 查询A的余额
- 减少的A的余额,B的账户增加响应的金额,
- 错误情况:若A钱减少的时候B发生一个错误,导致B没有收到钱那么问题就会很严重。可以用事务来防止出现上述的错误,把查询A账户,较少A账户,增加B账户位一个事务,作为一个整体。
-
事务的流程(默认不开启事务,手动开启提交,回滚事务)
- 开启事务
- 回滚事务(抛异常时回滚:临时修改的数据复原)
- 提交事务
-
-
-
基本操作
-
控制事务方式一:
-
查看事务的提交方式:
select @@autocommit;
通过set指令设置系统变量将提交方式改为手动set @@autocommit=0
(0为手动,1为自动) -
提交事务
commit;
-
回滚事务
rollback
-
-
控制事务方式二:
- 开启事务:
start transaction 或 begin;
- 提交事务:
commit;
- 回滚事务:
rollback;
- 开启事务:
-
案例:
-- 以store数据库为例建表 use store; -- 数据准备 create table account( id int auto_increment primary key comment '主键ID', name varchar(10) comment '姓名', money int comment '余额' ) comment '账户表'; -- 插入数据 insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000); -- 恢复数据 update account set money = 2000 where name = '张三' or name = '李四'; -- 完成转账正常流程 select * from account where name = "张三"; update account set money = money - 1000 where name = "张三"; update account set money = money + 1000 where name = "李四"; -- 模拟转账出现错误的情况 select * from account where name = "张三"; update account set money = money - 1000 where name = "张三"; 程序抛出异常... update account set money = money + 1000 where name = "李四"; -- 解决方法:控制事务(方法1:) select @@autocommit;-- 查看事务提交方式 set @@autocommit = 0; -- 设置为手动提交 -- 转账操作 (张三给李四转账1000) -- 1. 查询张三账户余额 select * from account where name = '张三'; -- 2. 将张三账户余额-1000 update account set money = money - 1000 where name = '张三'; 程序执行报错 ... -- 3. 将李四账户余额+1000 update account set money = money + 1000 where name = '李四'; -- 提交事务 commit; -- 回滚事务 rollback ; -- 方式二 -- 转账操作 (张三给李四转账1000) start transaction ; -- 1. 查询张三账户余额 select * from account where name = '张三'; -- 2. 将张三账户余额-1000 update account set money = money - 1000 where name = '张三'; 程序执行报错 ... -- 3. 将李四账户余额+1000 update account set money = money + 1000 where name = '李四'; -- 提交事务 commit; -- 回滚事务 rollback;
-
-
四大特征
- 原子性:不可分割的最小单位,要么一起成功,要么一起失败。
- 一致性:事务完成时,必须使所有的数据都保持一致性。
- 隔离性:隔离机制,保证事务不在外部并发操作受影响。
- 持久性:事务一旦提交或者回滚,对数据库中的数据改变就是永久的。
C:\ProgramData\MySQL\MySQL Server 8.0\Data
每一个数据库对应一个文件夹。
-
并发事务
A,B事务同时操作同一张数据库表时引发的问题
- 脏度:一个事务读取到另一个事务还没有提交的操作。
- 不可重复度:一个事务先后读取同一条记录,但是两次读取的数据不同。
- 幻度:一个事务按条件读取事务没有对应数据,但是在插入数据时又发现存在,好像出现了幻影。
-
事务隔离级别(解决并发事务的问题)(数据安全度和性能成反比权衡安全和并发性)
-
事务隔离级别
隔离级别 脏读 不可重复读 幻读 Read uncommited √ √ √ Read commited × √ √ Repeatable Read(默认) × × √ Serializable × × × -
查看事务隔离级别
select @@transaction_isolation;
-
设置事务隔离级别
set [session | global] transaction isolation level {read uncommited | read commited | repeatable read | serializable}
-
示例
-- 查看事务隔离级别 select @@transaction_isolation; -- 设置事务隔离级别 set session transaction isolation level read uncommitted ; set session transaction isolation level repeatable read ;
-
Mysql(基础——增删改查)
概述,sql(ddl,dml,dql,dcl),函数(字符串处理,日期处理,数值,流程控制),约束(主键,非空,默认,检查8.0.16,外键),多表查询(1:1,1:n,n:n,外连接,内连接,子查询),事务(四大特性,并发事务引发的问题)
文章来源:https://blog.csdn.net/weixin_52154534/article/details/134985827
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!