目录
什么是事务?
事务的特性
事务并发处理带来的问题
事务的隔离级别※
Mysql中事务处理的两种方法
ACID的原理
什么是事务?
MySQL 事务主要用于处理操作量大,复杂度高的数据。 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务的特性
原子性: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,在中间某个环节不会结束。
一致性: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性: 数据库允许多个并发事务同时对其数据进行读写和修改的能力,A给B赚钱和C给B赚钱这两个事务相互不影响。
持久性: 如果服务器断电了,分两种情况:如果断电时事务被提交了,来电后数据库中会保存刚刚被提交的事务;如果断电时事务没有被提交,来电后数据库中则不会保存未被提交的事务。
事务并发处理带来的问题
- 更新丢失:两个或多个事务选择了同一行,最后的更新覆盖了其他事务所做的更新操作
- 脏读:事务A读到了事务B已修改但未提交的数据,还在这个数据的基础上做了操作,如果事务B回滚,则A读到的数据无效
- 不可重复读:一个事务一段时间内读取到了别的事务修改的数据,导致前后读取不一致
- 幻读:一个事务一段时间内读取到了别的事务插入的数据,导致前后读取不一致
说到这里,总结一下,之所以有上述“读”的问题,是因为事务具有隔离性,多个事务可以互不干涉的同时进行。如果你想彻底解决所有读的问题,可以把MySQL的隔离级别调整为可序列化。
可序列化通过强制事务排序,使之不可能相互冲突,从而解决幻读的问题。简言之就是在每个读的数据行上加共享锁,这个级别可能导致大量的超时现象和锁竞争,效率低。
事务的隔离级别※
脏读、不可重复读、幻读都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。
事务级别越高,并发副作用越小,但付出的代价越大。因为事务隔离实质就是使事务“串行化”,显然与“并发”是矛盾的
Mysql默认的事务隔离级别是事务级,可以防止脏读和不可重复读,但无法防止幻读。
Mysql中事务处理的两种方法
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
ACID的原理
原子性:基于内存的事务性。如果更新失败,从内存中通过undolog日志进行回滚。
持久性:基于硬盘的事务性。事务提交后,基于redolog日志持久化到硬盘中
隔离性:InnoDB默认的隔离级别是可重复读。它基于锁机制实现。并通过MVCC(多版本并发控制:表现在读不加锁,数据隐藏列通过版本号匹配更新等)实现。
一致性:一致性是终极目标,一致性的实现不仅需要数据库层面保障,也需要应用层面保障