事务
是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撒销操作
请求,即这些操作要么同时成功,要么同时失败
。
默认MySQL的事务是自动提交的
,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务
。
SELECT @@autocommit;
SET @@autocommit=0; -- 设置为手动提交事务
START TRANSACTION 或 BEGIN;
COMMIT;
ROLLBACK;
事物的操作分为两种方式:
①通过设置事物的提交方式为手动提交
,通过commit
提交事物,通过rollback
去回滚事物。
②通过指令start transaction 或者时begin
来开启事物,事物执行操作完成以后,如果事物执行成功,执行commit指令,如果执行失败,执行rollback指令
。
事务是不可分割的最小操作单元,
要么全部成功,要么全部失败
。
如果在事务执行期间发生故障,数据库将自动回滚事务,使数据恢复到事务之前的状态。
事务完成时,必须使
所有的数据都保持一致状态
。
在事务开始之前,数据库的约束条件必须满足。
如果在事务执行期间违反了约束条件,事务将被回滚,使数据库恢复到一致的状态。
数据库系统提供的
隔离机制
,保证事务在不受外部并发操作影响的独立环境下运行。
事务的执行应该与其他事务相互隔离,每个事务应该感觉不到其他事务的存在。
隔离性确保了同时执行的多个事务不会相互干扰
,防止并发执行引起的数据不一致问题。
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
事务成功提交后,对数据库的修改将永久保存
,即使系统发生故障也不会丢失。
持久性保证了数据的可靠性和一致性。
脏读(Dirty read)是指当
一个事务在读取另一个事务未提交的数据
时发生的情况。
也就是说,一个事务读取了另一个事务修改但尚未提交的数据。
如果这个未提交的事务最终回滚,那么读取的数据就是无效的,这会导致脏读现象。
脏读可能会产生错误或不一致的结果。
不可重复读(Non-repeatable read)是指
一个事务在相同的查询语句下多次读取同一行数据时,会得到不同的结果
。
这是由于在事务执行期间,其他事务对该行进行了修改或删除,导致读取到的数据不一致。
例如,事务A在读取某一行数据后,事务B对该行数据进行了修改或删除,然后事务A再次读取同一行数据时,得到的结果和第一次读取的结果不一样。这种现象就是
不可重复读
。
不可重复读可能会导致数据不一致和逻辑错误的发生。
为了解决不可重复读问题,通常使用锁机制
或多版本并发控制(MVCC)
等方法来保证数据的一致性。
幻读(Phantom Read)是指
在一个事务内多次执行同一个查询,但在不同的查询中返回了不同的结果集
。
它与不可重复读不同之处在于,不可重复读是指读取到的行数据发生了变化,而幻读是指读取到的行数发生了变化
。
例如,事务A在执行某个查询时,返回了一组符合条件的数据行。
随后,事务B在事务A执行期间插入了一些新的数据行,使得事务A再次执行相同的查询时,返回的结果集中出现了新插入的数据行
,就像出现了幻觉一样,即发生了幻读。
幻读问题主要是由于
并发事务的插入和删除操作
引起的。
为了解决幻读问题,通常可以使用锁机制或多版本并发控制(MVCC)等方法来保证数据的一致性。
①
READ UNCOMMITTED
:读未提交
②READ COMMITTED
:读已提交
③REPEATABLE READ
:可重复读
④SERIALIZABLE
:可串行化
注意:
事物的隔离级别越高,数据库的并发性能越差,数据安全性也更低
。
SELECT @@TRANSACTION_ISOLATION;
SET[SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED
|REPEATABLE READ|SERIALIZABLE};