MySQL事务
事务的特性
-
原子性
指事务包含的所有操作要么都做,要么都不做,保证数据库是一致的
例子:甲账户向乙账户转账1000元,则先将甲账户减少1000元,再将乙账户增加1000元,这两个操作要么都提交,要么都回退,不可能发生一个有效另一个无效的情况。
-
一致性
指数据库中的数据在事务操作前和事务操作后必须满足业务规则约束。
例子:事务提交之后,甲乙账户的总金额在转帐前和转账后必须一致
-
隔离性
指当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
在甲、乙之间转账时,丙同时向甲转账,若同时进行,则甲、乙之问的一致性不能得到满足。所以在甲、乙事务执行过程中,一其他事务不能访问(修改)相关的数值。
-
持久性
事务处理结束后,对数据的修改就是永久的,即便系统发生故障也不会丢失
truncate和delete的区别
- truncate是DDL语句操作,delete是DML语句操作
- truncate不能回滚,delete可以回滚
- truncate清空表的自增id属性,从1重新开始记录,而delete不会
事务的隔离级别
-
读未提交(read uncommitted)
在其中一个事务中可以读取到其他事务未提交的数据变化。会导致脏读,不可重读,幻读的现象
脏读:A事务更新了一份数据,B事务读取到了这份更新的数据并进行了一些操作,由于某些原因,A事务发生了rollback操作,则B事务读取的数据就会不正确
-
读已提交(read committed)
在其中一个事务中,可以读取到其他事务已经提交的数据变化。会导致不可重读,幻读的现象
不可重读:在一个事务查询两次之中数据不一致,读取到其他已提交事务对旧数据的修改记录
-
可重复度(repeatable read)
在其中一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化。会导致幻读现象
幻读:在一个事务的两次查询中数据笔数不一致,读取到了其他已提交事务新增记录
-
串行(serializable)
在每个读的数据行上都需要加表级共享锁,在每次写数据时都要加表级排他锁。