MySQL 事务及四个特性
为什么需要事务?
用户对数据库的访问是多程序多线程的,为了维护数据的一致性,我们需要事务.(间隙锁会相关) 目前只有Innodb支持事务.
事务的四个特性
原子性(Atomic):一个事务是一个不可分割的最小单元,要么全部执行,要么全部不执行.(增加和减少必须保持一致,转500块钱,减500,增加500,两个指令全部执行)
一致性(Consistency):事务必须是从一个一致性的状态转移到另一个一致性的状态(转500,一方扣500,一方加500,两边数目一致)
隔离性(Isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务;
持久性(Durability):事务提交后,其结果永久保存在数据库中。(就算系统崩溃也不会被改变)
面试中隔离性被问的比较多.
隔离性:四个隔离级别
未提交读(read uncommited): 如果roll back导致脏读
已提交读(read commited): 解决脏读,产生不可重复读和幻读问题
可重复读(repeatable-read): 默认的隔离级别, 前一个事务中已经commit(把800改成750), 但本事务仍然可以重复读,获得老的值800, 除非本事务commit, 不然一直都是800. 在MySQL中解决所有问题(包括幻读),由间隙锁实现.
可串行化(serializable): 一定能解决幻读问题,但会通过锁表来进行,当session A在读表时, session B插入或者更改任何一条记录都不会成功。
三个问题:
脏读: 事务A读取了事务B更新的数据,但事务B进行了回滚操作,那么A读到的就是脏数据.(隔离级别为read uncommited)
不可重复读: 事务A多次读取同一数据, 事务B在事务A多次读取中,对数据更新并提交,导致事务A读到的数据结果不一致.(行数并没有增加, read commited, 能解决脏读问题, 但会产生不可重复读问题)
幻读: 在同一事务下当A用户读取某一范围的数据行时,B事务在该范围内插入了新行,当A用户再读取该范围的数据行时,会发现有新的“幻影”行(即读取到了B事务插入的数据)。 即违背事务隔离性要求。
MySQL中RR也可以解决幻读语法
开启事务://三个没有区别
Begin
START TRANSACTION(推荐)
behin work
事务回滚 rollback
事务提交 commit
还原点 savepoint