一.概念
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成
二.事务的四大特性
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变成另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
三.事务的并发问题
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据(针对update操作)
- 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。(针对update操作)
- 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。(针对insert操作或delete操作)
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
四.MySQL数据库事务的四个隔离级别
注意:MySQL只有数据库引擎为InnoDB 时,才支持事务,默认是InnoDB
- 读未提交(READ UNCOMMITTED)
在多个事务并发执行下,会产生 脏读,不可重复读,和幻读问题 - 读已提交(READ COMMITTED)
可以解决脏读,但解决不了不可重复读和幻读 - 不可重复读(REPEATABLE READ MySQL默认隔离级别)
可以解决脏读和不可重复读,但解决不了幻读 - 序列化读(SERIALIZABLE)
可以解决以上所有问题,但效率低,可读,不可写。像java中的锁,写数据必须等待另一个事务结束
五.MySQL几个常用命令
1.查看当前会话隔离级别
select @@tx_isolation;
2.查看系统当前隔离级别
select @@global.tx_isolation;
3.设置当前会话隔离级别
set session transaction isolatin level repeatable read;
4.设置系统当前隔离级别
set global transaction isolation level repeatable read;
5.事务相关
set autocommit=0 开启事务
start transaction(黑窗口可省略) 事务开始
commit 提交
rollback 回滚
savapoint a 设置回滚点
rollback to a 回滚到回滚点,回滚点前执行的语句不回滚,后回滚
6.查看当前autocommit属性值
show variables like "%autocommit%";
7.查看数据库引擎
show engines;