所谓事务,其实就是相当于操作系统里的原子性操作。它将一组对于数据库表的操作绑定在一起,只有所有操作都成功,才提交,只要有一个操作失败的话,那么就不会提交。这样的机制保证了数据库数据的原子性、一致性、隔离性以及持久性。
所谓ACID即是上面提到的原子性、一致性、隔离性以及持久性。
原子性:事务被视为不可分割的最小单元。事务的所有操作要么全部提交成功,要么全部失败回滚。
一致性:数据库在事务执行前后保持一致性的状态。在一致性的状态之下,所有事务对一个数据的读取状态都是相同。
隔离性:一个事务所做的修改,在提交之前,对其他的事务是不可见的。
持久性:一旦事务提交之后,其所做的修改将永久的保存在数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
首先还得明确,只有存储引擎为INNODB的MYSQL数据库这才支持事务!
要掌握事务机制,我们需要以下几个知识点:
1)对于表的增删改查的提交方式?
在MYSQL中,表的默认提交方式是自动提交(也即默认:autocommit=1),也就是对于表的操作是即时生效的。
可以通过set autocommit = 0; 修改为手动显示提交!显示提交的语句为 commit
2)事务如何开启?
在MYSQL中,事务通过语句 start transaction 开启!他等价于 set autocommit = 0。两者写一个就行了。
还有,在INNODB的锁机制中, start transaction 等价于 unlock 解锁操作
3)事务如何回滚?
记住!事务只支持 UPDATE/DELETE/INSERT语句的回滚,不支持SELECT/DROP/CREATE的回滚,但是事务处理块中可以使用这几条语句(SELECT/DROP/CREATE)。
rollback语句实现事务的回滚。默认情况下,回退到事务操作之前!在设置了保存点之后,可回滚到相应的保存点处!
4)如何设置保存点?如何根据设置的保存点进行回滚操作?
在每条操作之后添加语句 savepoint 保存点名称 即设置了对应操作的保存点!
通过 rollback to 保存点名称 可以回滚到相应的保存点,不过记住回滚点之前的操作都是生效的,回滚点之后的操作失效!
commit and chain 结束一个事务开启另一个事务
rollback and release 回滚之后断开客户端的连接
在无并发的情况之下,事务串行进行,隔离性一定能够满足!只要再满足原子性,就一定能够满足一致性!
在并发的情况之下,事务并行执行,除了要满足原子性,还要满足隔离性,事务的一致性才能满足!
事务做持久化是为了应对数据库崩溃的情况。