mysql事务,默认是自动提交(autocommit=1),就不能回滚事务。插入一条数据,rollback无法回滚;(1)但是设置set autocommit=0之后,插入可以回滚到之前状态,这个时候在手动commit一下,则rollback无法回滚了。体现了事务的持久性,一旦提交或者回滚持久生效的,其次事务提供给了我们一个返回的机会。事务还可以手动开启:(2)star transaction;(3)begin。手动开启可以回滚,commit之后则不可回滚。
事务有四大特征:1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。2. 持久性:当事务提交或回滚后(即事务一旦结束),数据库会持久化的保存数据。3. 隔离性:多个事务之间。相互独立。4. 一致性:事务操作前后,数据总量不变(小名小王互相转账,出了问题但是共2000不会变)。
事务 隔离级别:
1. read uncommitted:读未提交:a事务对数据进行操作,但操作之后没有提交,但是b可以看到a操作之后的结果。小明和网铺主,小明开始事务,付款了800,网铺主看到钱到账了就没管了。结果小明事后rollback,签回来了白嫖一波,网铺主亏大了。
* 产生的问题:脏读、不可重复读、幻读。
2. read committed:读已提交 (Oracle):只能读到另一个事务提交的数据,但还是会出现问题。读同一张表,前后数据不一致。小王会计要算某系统内money的平均值,查出数据之后去上厕所了,这个时候小红往里面加了一个账户存了100.小王回来算平均值就发现不对。
* 产生的问题:不可重复读、幻读 。
3. repeatable read:可重复读 (MySQL默认)
* 产生的问题:幻读。
4. serializable:串行化
* 可以解决所有的问题,性能最差。隔离级别越高,性能越差
【术语】并发事务遇到的问题
脏读:一个事务读取到了另一个事务没有提交的数据,就叫做脏读。在开发中不允许这种情况。
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同。
幻读:一个事务在按照条件查询数据的时候,没有对应的数据行,但是在插入的时候,又发现这条数据已经存在,好像出现了幻影,就叫做幻读。