mysql事务处理

mysql事务处理

什么是事务
  • 在平时的sql操作一般都是以语句的形式来完成的,比如插入一条数据只需要一条insert语句即可,但是事务可以简单的理解成是多条sql语句的集合
  • 比如网站的评论功能,我们要做的不是仅仅的插入一条数据到评论表里面就可以,而是在这之后还有很多一系列的事情要完成,比如用户要收到一条新消息,评论数要加1等等
表的引擎

mysql事务处理

  • 数据表都是可选数据引擎的,默认使用的是Innodb引擎,同时这个引擎也是支持事务处理的,所以我们都选择这个引擎即可,如果要修改表的引擎可以使用alter语句:alter table stu engine = “Innodb”
基础语法

mysql事务处理

  • 使用begin或者 star transaction关键字开启一个事务,后面或写的sql语句会被当成一个整体,
  • rollback关键字表示回滚,当sql代码出现错误的时候,会回滚停止执行,整个事务停止,而不是除了错误部分的sql停止。
  • commit关键字表示同步至所有的客户端
  • 只有在关键字begin或transaction和commit关键字之间的sql语句才是事务,关键字之外的sql语句还是属于会立即执行的sql语句,不算事务
设置全局的事务

mysql事务处理

  • 有的公司可能要求我们需要将每个功能都以事务的形式来处理,那么这个时候我们呢只需要使用 set autocommit = 0;这行代码在所有的代码最前面写上就行。
  • 事务的原理其实就是不自动提交,这样我们只需要使用commit来一一区分一个事务即可。
事务的隔离等级
  • 事务与事务之间的管理我们可以简单的理解成是一个个小房间,隔离等级相当于是小房间隔离的介质,隔离等级高的就像砖块一样,看不见对面的,隔离等级低的就像纱布一样,可以很轻松的看到对象
  • 使用select @@tx_isolation;可以查看当前的隔离等级
  • 使用set session transaction isolation level 等级名可以设置隔离等级
    mysql事务处理
脏读
  • 脏读的是在事务隔离等级最低的read-uncommitted情况下会发函俄国脏读
  • mysql事务处理
    意思就是当一个隔离等级最低的客户端修改但是未提交的数据,另外一个也是隔离等级最低的客户端能够读取到这个未提交的数据,这种情况就被叫做脏读
    脏读其实是很影响我们数据的同意的一样读取形式,基本很少用
不可重复读

mysql事务处理

  • 这些都是针对于事务的脏读状态,不可重复读事务可以读取到提交的这个数据,但是读取不到未提交的数据,这种情况叫做不可重复读
可重复读
  • 可重复读是隔离等级的第三级,也是mysql中默认的隔离等级
  • set session transaction isolation level repeatable read设置可重复读
  • 在可重复度的状态下,AB两个事务完全隔离开,无论A事务怎么处理,就算提交了,也不会影响B事务的读出结果。
幻读

mysql事务处理

  • 幻读好比于出现了幻觉,我们查询的时候只能查询到自己事务里面的值可能只有7条,但是我们做一下更新操作的时候,会发现更新的条数是大于7的,那么这种情况就叫做幻读,更新的条数大于查询的条件。
  • 使用最高等级的事务隔离等级serializable就能够阻止这种幻读行为。