事务
构成单一逻辑工作单元的操作集合,我们称为事务(transaction)。
事务是一组原子性的SQL查询,或者说是一个独立的工作单元。
即使有故障,数据库系统也要保证事务的正常执行——要么执行整个事务,要么属于该事务的操作一个也不执行。
START TRANSACTION/BEGIN:开启一个事务,标记事务的起点。标志事务的开始,在Mysql中可以用set autocommit=0替代。
COMMIT:提交事务,表示事务成功被执行。结束事务。 重要的是,如果打开两个事务,一个事务A修改后commit,另一个事务B只有commit后才会看到事务A的修改结果。
ROLLBACK:回滚事务,回滚到初始状态或者回滚点。不代表发生故障,它也是一个数据库操作,属于事务的一部分。表示回滚事务,回滚到事务开启前的状态,或者中间的某个回滚点。要想ROLLBACK生效,就必须要COMMIT。
SAVEPOINT:回滚点
具体示例:
savepoint sp1;
updata member1 set id=100 where name = ‘xiaoming’;
rollback to sp1;
RELEASE SAVEPOINT: 删除回滚点
SET TRANSACTION:设置隔离级别
注意事项:
发生故障时,结束事务,即使没有设置回滚点,都会回到事务开启前的状态。
事务的性质 ACID
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。无论是操作系统崩溃,还是计算机停止运行,这项要求都要成立。
一致性(Consistency)???????为什么要保持一致?我还是无法理解,什么是一致性???一致性就是对总量不变?如果修改了AB,但是我不读取AB,是否违反一致性,还是说数据库回自己检查?那直接修改数值,就不是一致性吗?是否意味着不能进行修改?
事务作为一个原子性操作,它从一个一致性的数据库状态开始运行,事物结束时,数据库的状态必须再次是一致的。
隔离性(Isolation)
尽管多个事务可能并发执行,但系统保证,对于任何一对事务T1和T2,在T1看来,T2要么在T1开始之前已经完成,要么在T1完成之后才开始执行。因此,每个事务都感觉不到系统中有其他事务在并发地执行。
并不是同时发生,轮流发生,或者在一个时间段内发生。但是隔离性与并发会有冲突不可能百分百实现。
持久性(Durability)
一个事务成功完成后,它对数据库的改变必须是永久的,即使出现系统故障。
并发执行时可能会引发的问题(破坏了隔离性)
幻读
并发执行事务会引发的问题,简单来说就是一个事务A需要进行前后两次统计,或者说就是前后读两次,然后另一个事务B在此期间对事务A涉及到的表插入了新的符合统计条件的记录,并且提交了。这样就导致事务A前后两次统计到的数据不一致,这种现象我们称之为幻读。
从这个事务的视觉来看,平白无故多加了几条数据,就像看到幻觉那样,看到不应该看到的东西,就等于产生幻觉了,所以叫做幻读。同一事务中生成的两张报表是不一致的。
脏写
脏写是指多个事务并发写同一数据,先执行的事务所写的数据会被后写的数据覆盖。
脏写会导致更新消失,就好像先提交的事务根本没有执行一样。
例如事务A对x+100,但是还没写回去,此时事务B插入,对x-100,并且写回,等事务B结束时,事务A才写回,这样就破坏了事务原则里面的一致性。先写后读?
脏读
同样是违反一致性,并发得读取同一数据,在不同时机读取同一数据,得到不同的结果。
如果一个事务A向数据库写数据,但该事物还没提交或者终止,另一个事务B就看到事务A写入数据库的数据,这个现象我们称之为脏读。 先写后读?
不可重复读(与幻读区别是幻读是插入新的行,不可重复读是修改?)
同一事务中生成的两张报表是不一致的,因为中间会有事务对报表进行修改,违反一致性。
一个事务有对同一个数据项的多次读取,但是在某前后两次读取之间,另一个事务更新该数据项,并且提交了。在后一次读取时,感知到了提高的更新。这个现象就是不可重复读(到相同数据)?