MySQL事务【详解-最新的总结】_悬浮海的博客-CSDN博客_mysql事务详解
事务:
- 对数据库的一批操作,这些操作要么全都执行,要么全不执行,不存在部分执行的情况。
- 在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。
- 一个事务可能只有一条sql,也可能有多条sql。
事务的特性(ACID):
- 原子性(Atomicity):一个事务内所有的sql执行都当做一个整体,这些sql操作要么全部成功,要么全部失败。
- 一致性(Consistency): 一个事务使得数据库从一个一致性状态变换到另一个一致性状态。从业务逻辑上讲,就是最终结果是对的,与预期结果相一致。比如A给B转钱,不可能A的钱少了,B的钱没增加
- 隔离性(Isolation): 一个事务在执行时,不会对另一个事务的执行产生影响,互不干扰。
- 一致性(Durability): 一个事务一旦提交,他对数据库的改变是永久的。
事务提交:
1、隐藏事务:mysql中默认是隐藏事务,执行insert,update,delete是都是自动提交,回滚。
2、显示事务:
通过start transaction 命令开启,commit | rollback 结束
可以用savepoint POINT 保存回滚点, 然后rollback POINT 回滚到指定的地方
事务的隔离级别(由低到高):
读未提交(READ-UNCOMMITTED) :其他事务可以读取到本事务未提交的数据
读已提交(READ-COMMITTED): 其他事务只能可以读取到本事务已经提交的数据
可重复读(REPEATABLE-READ):本事务内,无论执行多少次查询sql(同一条),查询出来的结果都是一样
串行化(SERIALIZABLE): 所有事务按顺序执行(读写,写读,写写 操作均加了锁)
以下情况均是同个表的
脏读:
A 事务在执行时,B事务往修改一条数据,然后回滚,在B回滚前,A已经读取到了B修改后的数据,此时该数据就是脏数据,出现此情况是因为读取到了B事务未提交的数据
不可重复读:
A事务在读取某一批数据后,B对其中某些数据作了修改(此时B未提交),A执行同样的sql和之前的结果一样,当B提交了之后,A再执行同样的sql,但是结果和之前不一样。
幻读:
A事务在读取某一批数据,B事务插入了一条新数据并提交,此时A也想插入相同的数据,结果插入失败,然后也查询不到该数据。
幻读和不可重复读,理论上幻读应该算是不可重复读的一种,只是不可重复读对应的是修改,而幻读对应的是新增和删除。