目录

什么是事务?

事务的特性

事务并发处理带来的问题

事务的隔离级别※

Mysql中事务处理的两种方法

ACID的原理


 

什么是事务?

 

MySQL 事务主要用于处理操作量大,复杂度高的数据。 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

 

 

事务的特性

 

原子性: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,在中间某个环节不会结束。

一致性: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

隔离性: 数据库允许多个并发事务同时对其数据进行读写和修改的能力,A给B赚钱和C给B赚钱这两个事务相互不影响。

持久性: 如果服务器断电了,分两种情况:如果断电时事务被提交了,来电后数据库中会保存刚刚被提交的事务;如果断电时事务没有被提交,来电后数据库中则不会保存未被提交的事务。

 

 

事务并发处理带来的问题

 

  • 更新丢失:两个或多个事务选择了同一行,最后的更新覆盖了其他事务所做的更新操作
  • 脏读:事务A读到了事务B已修改但未提交的数据,还在这个数据的基础上做了操作,如果事务B回滚,则A读到的数据无效
  • 不可重复读:一个事务一段时间内读取到了别的事务修改的数据,导致前后读取不一致
  • 幻读:一个事务一段时间内读取到了别的事务插入的数据,导致前后读取不一致

 

说到这里,总结一下,之所以有上述“读”的问题,是因为事务具有隔离性,多个事务可以互不干涉的同时进行。如果你想彻底解决所有读的问题,可以把MySQL的隔离级别调整为可序列化。

可序列化通过强制事务排序,使之不可能相互冲突,从而解决幻读的问题。简言之就是在每个读的数据行上加共享锁,这个级别可能导致大量的超时现象和锁竞争,效率低。

 

 

事务的隔离级别※

 

脏读、不可重复读、幻读都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

如何理解mysql的事务 mysql中的事务是什么_数据

事务级别越高,并发副作用越小,但付出的代价越大。因为事务隔离实质就是使事务“串行化”,显然与“并发”是矛盾的

Mysql默认的事务隔离级别是事务级,可以防止脏读和不可重复读,但无法防止幻读。

 

 

Mysql中事务处理的两种方法

 

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN  开始一个事务
  • ROLLBACK  事务回滚
  • COMMIT  事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0  禁止自动提交
  • SET AUTOCOMMIT=1  开启自动提交

 

 

ACID的原理

 

原子性:基于内存的事务性。如果更新失败,从内存中通过undolog日志进行回滚。

持久性:基于硬盘的事务性。事务提交后,基于redolog日志持久化到硬盘中

隔离性:InnoDB默认的隔离级别是可重复读。它基于锁机制实现。并通过MVCC(多版本并发控制:表现在读不加锁,数据隐藏列通过版本号匹配更新等)实现。

一致性:一致性是终极目标,一致性的实现不仅需要数据库层面保障,也需要应用层面保障