您的位置:首页 > 教育 > 锐评 > 施工企业财务经理年终总结_网页制作的方法_网络推广有哪些渠道_服装品牌策划方案

施工企业财务经理年终总结_网页制作的方法_网络推广有哪些渠道_服装品牌策划方案

2025/4/18 12:35:56 来源:https://blog.csdn.net/qq_53123067/article/details/144469540  浏览:    关键词:施工企业财务经理年终总结_网页制作的方法_网络推广有哪些渠道_服装品牌策划方案
施工企业财务经理年终总结_网页制作的方法_网络推广有哪些渠道_服装品牌策划方案

目录

初识事务

事务特性

事务并发

事务隔离


初识事务

事务:是一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功要么同时失败,例如当进行银行转账的时候,一旦转账的过程中发送了异常,则会取消此次转账并进行操作回滚,回到转账之前的状态:

要知道MySQL的事务默认是自动提交的,也就是说当执行一条DML语句的时候,MySQL会立即隐式的提交事务,那么如果出现数据操作异常的情况,如何对事务进行精确把控呢,这里有两种方式:

手动提交:因为MySQL的事务是默认提交的,我们可以执行select @@autocommit语句查看当前事务的提交方式,如果是1就是自动提交,如果是0就是手动提交,如果我们向设置手动提交的话直接执行如下语句进行事务提交方式的切换即可,如下所示:

具体的事务操作命令主要有以下几行:

-- 查看/设置事务提交方式
select @@autocommit;
set @@autocommit = 0;-- 提交事务
commit;-- 回滚事务
rollback;

接下来我们创建一个账户表进行举例,执行如下语句:

-- 数据准备
create table account (id int auto_increment primary key comment '主键ID',name varchar(20) not null comment '用户名',money int not null comment '余额'
) comment '账户表';
insert into account (id, name, money) values(null, '张三', 2000),(null, '李四', 2000);

如下当我们设置手动提交事务之后,语句执行报错直接回滚即可,即使语句执行没错也必须手动提交事务,数据才会真正更新到数据库当中,如下所示:

控制事务:我们不修改MySQL底层自动提交事务的方式,而是通过语句来控制事务的提交与否,如下所示:

-- 开始事务
start transaction 或 begin;
-- 提交事务
commit;
-- 回滚事务
rollback;

事务特性

事务主要分为以下这个特性:

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

这两种特性就是说当执行操作的时候要不成功要不失败,成功和失败的状态必须保持一致,成功状态下就是执行操作改变数据的应有的情况,失败则不改变数据库原有的情况:

隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

事务之间是相互独立的,两个事务不会因为同时操作就互相影响:

持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

事务一旦提交就会提交到数据库,数据库就会修改对应磁盘中的数据,使得数据能够永久保存:

事务并发

事务并发指的啊A事务和B事务它们两个在同时操作某一个数据库,甚至于某一张表的时候所引发的一些问题,下面事务并发所产生的一些问题,如下所示:

问题描述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时又发现这行数据已经存在,好像出现了 “幻影”

脏读:从下图可以看出当事务A更新数据,但是还没有提交事务时就被事务B读取了,此时就称脏读:

不可重复读:从下图可以看出当事务A读完数据库数据的时候,被事务B更新了数据,然后事务A执行了第二次读取数据时,发现与上一次读取的数据不同,此时就称不可重复读:

幻读:从下图库看出当事务A查询id为1的时候没有查询到,此时突然被事务B并发插入了一条id为1的数据,然后事务A往数据库中插入id为1的数据发现此时插入不上,因为其已经存在了id为1的数据导致插入报错,此时事务A又执行了查询语句发现又查询不到,因为之前已经执行过一次了,是不可重复读的,此时就称之为幻读:

事务隔离

事务隔离就是为了解决事务并发所产生的问题的,事务的隔离级别主要分为以下几种,这四种隔离级别从上到下隔离级别越来越高,Serializable的隔离级别最高但是其性能是最差的,隔离级别越高性能越差,隔离级别越低性能越高,如下:

隔离级别脏读不可重复读幻读
Read uncommitted(读,未提交)
Read committed(读,已提交)× 
Repeatable Read(默认,可重复读)× × 
Serializable(串行化)× × × 

我们在业务当中去选择隔离级别的时候既要去权衡数据的安全性,又要去权衡数据库的并发性能,接下来讲解如何查看及设置事务的隔离级别,如下所示:

-- 查看事务隔离级别
select @@transaction_isolation;
-- 设置事务隔离级别
set [session | global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com