一、Mysql事务是什么
MySQL中,事务是指最小的不可分割的执行单元,如数据库在执行(如插入、更新、删除等)操作时,这些操作被视为一个工作单元,要么全部执行成功(Commit),要么全部失败回滚(Rollback)。事务可以确保数据库的一致性和完整性。
举例:小明向小红转账100元过程中,小明账户需要扣减100元,小红账户需要增加100元,小明账户钱的减少和小红账户的增加就是一个事务,这两个步骤要么都操作成功,要么都失败
在mysql中默认每一条SQL就是一个单独的事务
#转账:
update account set balance = balance - 100 where userid = 1;
update account set balance = balance + 100 where userid = 2;
开启和提交事务
#手工开启事务:
begin/start transaction
update account set balance = balance - 100 where userid = 1;
update account set balance = balance + 100 where userid = 2;
#提交/回滚事务
commit/rollback
二、事务的特性
原子性(Atomicity):
最小的操作单元,整个操作要么一起提交成功,要么全部失败回滚
一致性(Consistency):
事务中操作的数据改变是一致的,写入数据结果应完全符合预设规则
隔离性(Isolation):
隔离性保证了并发执行的事务不会互相干扰,每个事务都感觉像是在独立地执行一样
持久性(Durability):
事务一旦被提交,事务所做的修改会永久保存,不会因为系统意外情况导致数据丢失
三、MySQL的事务隔离级别
读未提交(READ UNCOMMITTED)
最低的隔离级别,允许事务读取尚未提交的其他事务的数据,可能导致脏读、不可重复读和幻读
读已提交(READ COMMITTED)
这个级别的隔离性要求一个事务只能读取已经提交的其他事务的数据,可以避免脏读,但仍可能出现不可重复读和幻读
可重复读(REPEATABLE READ)
确保在一个事务内多次读取同样的记录结果是一致的,解决了不可重复读的问题,但幻读仍可能发生,这是MySQL默认隔离级别
串行化(SERIALIZABLE)
最高级别的隔离,通过完全串行化的执行事务来避免脏读、不可重复读和幻读,但会显著降低并发性能。
脏读
脏读是数据库并发操作中的一种现象,指的是一个事务读取了另一个事务尚未提交的数据。
上述图片例子中,事务1读取到了事务2没有提交的数据,但是事务2发生回滚更新是不生效的,这就导致事务1读取到了一个无效(脏)数据
不可重复读
MySQL中不可重复读是指在同一个事务内,执行相同的查询语句多次,却得到不同结果的现象
上述图片例子中,事务1先查询数据是16,事务1还在执行过程中,事务2更新了这条数据,数据变为18并提交成功,最后事务1再次查询数据时就会发现第一次查询的数据与第一次查询的数据不一致,影响事务的一致性
幻读
幻读是指在一个事务中,前后执行相同的查询,却得到了不同的结果集,原因是其他事务插入了新的数据行
上述图片例子中,事务A先查询age大于15的只有一条数据,在事务A还在执行过程中,事务B成功插入了一条age大于15的数据,此时事务A再次查询age大于15数据时就会发现与第一次查询结果不一致,这也导致了事务的一致性
**注:图片来源于网络