什么是事务
MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你就需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务是一个事件处理的完整的过程。比如:存款,取款,转账等操作都可以称之为一个事务。
事务的应用场景
我们想完成一次转账业务,那么他会多次去访问我们的数据库。转账实上就是从一个账户扣钱欧安,在往一个账户上加钱。这样我们执行了二次sql,如果其中一个sql失败,那么整个业务失败
mysql中有两种事务提交方式:
手动提交
自动提交
手动提交的过程:开启事务---执行多条件SQL语句---成功---事务提交 0
|----失败---事务回滚
事务执行成功的过程:开启事务->执行多条件SQL语句->成功->事务提交
事务执行失败的过程:开启事务->执行多条件SQL语句->失败->事务回滚
事务自动提交
0000001MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务。
事务开始->update/delete/insert into->事务提交
事务原理
一个事务会涉及到大量的CPU计算和操作,这些操作被打包成一个执行单元,要么同时都完成,要么同时都不完成。
自动提交原理图
如果没有显示启动事务,数据库会根据auto commit 的值,默认每条sql操作都会自动提交
Client---请求连接---Server-身份认证,建立连接对当前用户,开启临时事务日志
|---写SQL---接收SQL -执行SQL,将结果直接写入数据库表---同步DB-DB
手动提交原理图
如果开启了事务,其中有任何一条语句因为崩溃或其他原因无法执行,那么该组中所有的sql语句都不会执行。
Client---请求连接---Server-身份认证,建立连接对当前用户,开启临时事务日志
|--开启事务---改变原操作机制
|--写SQL---接收SQL执行SQL,将结果写入临时日志文件--临时日志文件:(断开连接临时文件清空)SQL操作结果--提交-DB
|--SQL操作结果--查询结果:从数据库表查询,经过临时日志文件加工返回
|--事务提交或回滚--清空临时文件: 提交:同步到数据库表 回滚:直接清空
事务提交步骤
客户端连接上服务器端,创建链接同时创建连接同时创建当前用户的临时事务日志文件。
开启事务,改变原有的操作机制(所有的操作都会陷入临时日志文件)。
写入SQL,接受并执行SQL,所有的SQL操作都会写入临时文件;返回数据时,从数据库表拿去数据,但要通过临时日志文件加工在返回。
事务的提交或回滚,提交:同步临时日志文件中的SQL操作结果到数据库表;回滚:清除临时文件
事务回滚
我们可以在mysql事务处理过程中定义保存点(save point),然后回滚到指定的保存点前的状态。
注意:设置保存点可以让我们在失败的时候回到保存点,而不是回到事务开启的时候。
事务隔离级别
事务特性
原⼦性( Atomicity ): 事务内的操作要嘛全部完成,要嘛全
部回滚。
⼀致性 (Consistency) : 事务执⾏的前后都是合法的数据状
态,不会违反任何的数据完整性。
隔离性( Isolation ) : 主要是事务之间的相互的影响,根据隔
离有不同的影响效果。
持久性( Durability ): 事务⼀旦提交,就会体现在数据库
上,不能回滚。
事务的并发问题
脏读: ⽐如事务 A 执⾏的过程中,读到了事务 B 未提交的内
容。
不可重复读: 指⼀个事务在前后两次查询的结果不⼀致。
幻读: 幻读是指前后两次相同条件下的查询,后⼀次查询读到
了前⼀次查询没有的⾏数据。
手动提交的过程:开启事务---执行多条件SQL语句---成功---事务提交
|----失败---事务回滚
事务执行成功的过程:开启事务->执行多条件SQL语句->成功->事务提交
事务执行失败的过程:开启事务->执行多条件SQL语句->失败->事务回滚
事务自动提交
MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务。
事务开始->update/delete/insert into->事务提交
脏读
脏读是⽐较危险的事情,如果张三在李四那⾥买了⼀个汽球花
了 500 元,那么张三转帐给李四后,李四发货给张三,张三收
到货物后把事务回滚,这样李四再也没有看到钱