事务是指要么所有的操作都成功执行,要么所有的操作都不执行的一组数据库操作。
一、MySQL提供了四个事务特性,即ACID:
1. 原子性(Atomicity):一个事务中的所有操作要么全部提交成功,要么全部回滚失败,保证事务的原子性。
2. 一致性(Consistency):在事务开始之前和事务结束后,数据库状态必须是一致的。这意味着,在事务执行期间,如果出现任何错误,则必须回滚所有对数据库的更改以确保其状态的一致性。
3. 隔离性(Isolation):每个正在进行的事务必须与其他并发事务隔离,防止数据冲突。MySQL提供了四种隔离级别,最弱的是读未提交,最强的是序列化。
4. 持久性(Durability):一旦事务被提交,它对数据库的更改就应该是永久性的。也就是说,即使发生系统故障、崩溃或其他异常情况,已提交的事务仍然应该保留它们所做的更改。
二、MySQL的事务保证
1.原子性:使用undolog日志记录事务操作的所有修改,在回滚时利用undolog日志进行undo操作,撤销前面已经执行的sql语句。
2.一致性:其他三个特性共同保证了事务的一致性。只有当一个事务全部成功地完成,才能保证数据库状态的一致性。如果出现任何问题导致事务失败,则必须回滚事务并撤销所有更改,以确保数据库状态与开始事务之前的状态一致。
3.隔离性:使用多版本并发控制 (MVCC) 机制实现事务的隔离性。此机制可以防止事务之间的干扰,并允许并发访问数据库,从而提高了系统的吞吐量。MySQL支持四种隔离级别,可以根据应用程序的需要选择适当的隔离级别。
4.持久性:使用redolog 日志和内存缓存来确保事务的持久性。在写入磁盘之前,MySQL将所有修改记录在redolog日志中,从而保证即使系统崩溃或断电,已提交的事务也不会丢失。同时,在内存缓存中保存数据可以加快数据库的读写速度,从而进一步提高系统的性能。
三、MySQL提供了四种事务隔离级别:
1. 读未提交(Read Uncommitted):最低级别的事务隔离级别,允许一个事务中的修改可以被另外一个未提交的事务所读取。这种隔离级别最容易造成脏读、不可重复读和幻读。
2. 读已提交(Read Committed):已提交的数据才能被其他事务读取,避免脏读现象的出现。但由于在同一事务内两次相同的 SELECT 可能得到不同的结果,因此可能产生不可重复读的问题。
3. 可重复读(Repeatable Read):这种隔离级别保证同一事务内多次读取同样的数据时,它们所读取的内容总是一致的。它常常使用锁机制来实现,会造成一定的性能损失。
4. 序列化(Serializable):最严格的事务隔离级别。通过强制事务串行执行,来防止脏读、不可重复读、 幻读以及更新丢失等问题的发生。然而,这也带来了巨大的数据库性能开销,应该避免选择这种隔离级别,除非必要。