MySQL事物

什么是事务: 在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转
账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失
败。
事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有
的SQL 语句都要回滚,整个业务执行失败。
 
MySQL默认是自动提交事物:
自动提交事务
MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执
行完毕自动提交事务,MySQL 默认开始自动提交事务
 
我们可以改成手动提交:

 

 

 

 @@表示全局变量,1 表示开启,0 表示关闭:

 

事务可以保证多个操作原子性,要么全成功,要么全失败。

对于数据库来说事务保证批量的DML要么全成功,要么全失败。

 

事务具有四个特征ACID:

 

原子性(Atomicity)

 

  整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。

 

一致性(Consistency)

 

  在事务开始之前与结束之后,数据库都保持一致状态,即数据库的完整性约束没有被破坏 。

 

  类似于能量守恒,比如A向B转账,不可能A扣了钱,B却没收到。

 

隔离性(Isolation)

 

  一个事务对另一个事务的影响。类似于多线程并发。

 

持久性(Durability)

 

  在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
 
事务中存在一些概念事务(Transaction):
  • 一批操作(一组DML)
  • 开启事务(Start Transaction)
  • 回滚事务(rollback)
  • 提交事务(commit)
  • SET AUTOCOMMIT:禁用或启用事务的自动提交模式

 

当执行DML语句是其实就是开启一个事务

 

关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任

 

何意义),对于create、drop、alter这些无法回滚。事务只对DML有效果。

 

注意:rollback,或者commit后事务就结束

 

事务原理

事务开启之后, 所有的操作都会临时保存到事务日志中, 事务日志只有在得到 commit 命令才会同步到数
据表中,其他任何情况都会清空事务日志(rollback,断开连接)

 

事务的步骤
1. 客户端连接数据库服务器,创建连接时创建此用户临时日志文件
2. 开启事务以后,所有的操作都会先写入到临时日志文件中
3. 所有的查询操作从表中查询,但会经过日志文件加工后才返回
4. 如果事务提交则将日志文件中的数据写到表中,否则清空日志文件。
 

事务的隔离级别
事务的并发问题
1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2. 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提
交,导致事务A多次读取同一数据时,结果 不一致。
3. 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就
在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,
   就好像发生了幻觉一样,这就叫幻读。
 
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决
不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
 

 

 

posted on 2020-08-31 11:20  白嫖老郭  阅读(76)  评论(0)    收藏  举报

导航