MySQL
中的事务是一组被视为一个单独逻辑单元的操作。在一个事务中,一组操作被视为一个单独的、原子的操作单元,这些操作要么全部执行成功,要么全部回滚。MySQL 中的事务由以下四个属性组成:
一、四个属性
1、原子性(Atomicity)
一个事务中的所有操作要么全部执行成功,要么全部回滚,不会出现部分执行的情况。
2、一致性(Consistency)
在一个事务中,所有的操作必须保证数据库从一个一致的状态变为另一个一致的状态,也就是说,数据库在事务开始和结束时的状态必须保持一致。
3、隔离性(Isolation)
每个事务的执行应该是相互独立的,每个事务都应该感知不到其他事务的存在。
4、持久性(Durability)
一旦一个事务提交成功,其所做的更改就应该被永久地保存到数据库中。
二、事务操作
事务处理来保证数据的完整性和一致性,MySQL提供了 BEGIN
、COMMIT
和 ROLLBACK
等语句来控制事务的执行。在开始一个事务之前,需要使用 BEGIN
语句来指定开始一个事务。在一个事务中执行的操作可以是插入、更新、删除和查询等。当事务执行成功时,使用 COMMIT
语句提交事务。如果事务执行失败或需要回滚,则可以使用 ROLLBACK
语句回滚事务。
三、隔离级别
事务隔离级别是数据库管理系统为了避免事务之间出现问题而采用的一种机制。MySQL提供了四个标准的事务隔离级别:
3.1 读未提交(READ UNCOMMITTED)
在这个隔离级别下,事务可以读取其他事务未提交的数据,也就是说,一个事务可以读取另一个事务中未提交的更改。这种隔离级别可能会导致脏读(dirty read),也就是读取到未提交的、可能被回滚的数据。这个隔离级别的优点是并发性高,但数据的一致性无法得到保障。
3.2 读已提交(READ COMMITTED)
在这个隔离级别下,事务只能读取其他事务已经提交的数据,也就是说,一个事务只能读取另一个事务中已经提交的更改。这个隔离级别可以避免脏读,但仍然可能会出现不可重复读和幻读问题。
提示
该级别是MySQL的默认事务隔离级别
3.3 可重复读(REPEATABLE READ)
在这个隔离级别下,事务在开始执行后会创建一个快照(snapshot),所有的查询都会使用这个快照。在这个隔离级别下,一个事务中的查询结果始终相同,不受其他事务的影响。这个隔离级别可以避免脏读和不可重复读问题,但仍然可能会出现幻读问题。
3.4 可串行化(SERIALIZABLE)
在这个隔离级别下,事务是完全串行化的,每个事务必须等待前一个事务执行完毕后才能执行。这个隔离级别可以避免脏读、不可重复读和幻读等所有的并发问题,但是在高并发环境下,性能会受到影响。
四、总结
需要注意的是,事务隔离级别越高,对并发的影响就越大,系统的性能也会受到影响。因此,在选择隔离级别时,需要根据实际情况进行选择,以平衡数据的一致性和并发性。
通常在开发中可以通过设置 SESSION 或全局变量的方式来更改隔离级别,以满足不同的需求。