事务的设置
在有活动事务时不允许设置全局或会话的事务:即在start transaction语句中,使用set语句设置事务;
事务的隔离级别:可以在运行时通过tx_isolation进行设置,SET GLOBAL tx_isolation='REPEATABLE-READ';SET SESSION tx_isolation='SERIALIZABLE';
事务的基本要素(ACID)
原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态;
一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到;
隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰;
持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚
事务的并发问题
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读:指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
四个隔离级别
READ-UNCOMMITTED:未提交读,出现脏数据
READ-COMMITTED:提交读,多次重复读出来的数据不一致(大多数数据库默认事务隔离级别)
REPEATABLE-READ:可重复性读(MySQL的默认事务隔离级别),多次重复读出来的数据一致,但是可能会出现幻读;InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
SERIALIZABLE :最高隔离级别,通过读数据行加共享锁,增加了超时及锁竞争
不同隔离级别存在问题如下表