事务
数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一组逻辑操作单元,这些操作要么全部成功执行,要么全部不执行,以保持数据的一致性和完整性。事务是确保数据可靠性的重要机制之一,特别是在多用户并发访问数据库的情况下。
在MySQL中,事务(Transaction)是一组要么全部执行成功,要么全部不执行的SQL语句集合。事务的主要目的是确保数据的一致性和完整性,即使在出现错误或系统崩溃的情况下也能保护数据不受损害。
开启事务
BEGIN;
START TRANSACTION;
结束事务
结束事务分为提交和回滚
提交:COMMIT;
回滚:ROLLBACK;
演示
在初始表demo中只有一个数据
接下来使用START TRANSACTION;开启事务,并对数据库进行操作:
然后尝试使用rollback回滚,回滚后再次查询:
可以发现前面3条插入语句都被rollback撤销了,这会将数据库恢复到事务开始之前的状态。
接下来使用begin重新开启事务,并插入两条数据:
使用select语句查询:
可以发现尽管没有提交事务,但是查询数据时仍然能查到数据。
原因是MySQL使用的是InnoDB存储引擎,而InnoDB的默认隔离级别是REPEATABLE READ(可重复读)。
什么是隔离级别?
隔离级别
事务隔离级别是指一个事务与其他事务隔离的程度。在数据库系统中,多个事务可能会并发执行,而这些事务之间可能会相互干扰。事务隔离级别就是用来解决这种并发问题的一种机制,它规定了事务在并发执行时的行为。
SQL标准定义了四种事务隔离级别,它们分别是:
-
读未提交(Read Uncommitted):
-
允许事务读取另一个事务还未提交的更改。
-
可能导致脏读、不可重复读和幻读。
-
在MySQL的InnoDB存储引擎中,实际上并不支持真正的读未提交隔离级别,而是会将其提升为读已提交。
-
-
读已提交(Read Committed):
-
确保事务只能读取另一个事务已经提交的更改。
-
避免脏读,但可能导致不可重复读和幻读。
-
在这个级别下,每次读取都会获取数据的最新状态。
-
-
可重复读(Repeatable Read):
-
确保在同一个事务中多次读取同一数据时,结果一致。
-
避免脏读和不可重复读,但可能导致幻读。
-
这是MySQL InnoDB存储引擎的默认隔离级别。
-
在这个级别下,事务开始时建立的数据快照在整个事务期间都是可见的。
-
-
串行化(Serializable):
-
确保事务完全串行化执行,即事务一个接一个地按顺序执行。
-
避免脏读、不可重复读和幻读。
-
提供最高的事务隔离级别,但并发性能最低。
-
在可重复读的级别下,可以看到自己事务开始时的数据状态,对于在事务内的更改依然可以通过select语句查询到,因为InnoDB允许事务内的一直性读取。
接下来提交事务:
提交事务后,数据已经成功的在数据库表上修改。
使用事务的主要好处在于它能够确保数据的一致性和完整性,同时提高系统的可靠性和稳定性。当发生故障时,也能及时的使用回滚进行恢复。