概览
数据库事务(Database Transaction)是由一系列数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部回滚到事务开始前的状态,以保证数据的一致性和完整性。
MySQL 作为一种广泛使用的关系型数据库管理系统,也支持事务处理。MySQL 中的事务(Transaction) 是指一组 SQL 查询,它们被视为一个独立的工作单元,在执行过程中要么全部成功提交(Commit) ,要么全部失败回滚(Rollback)
ACID 特性
事务通常具备以下四个基本特性,通常简称为 ACID 特性:
-
原子性(Atomicity):事务中的所有操作要么全部成功提交,要么全部失败回滚,不存在部分提交的情况。
-
一致性(Consistency):事务执行前后,数据库的状态必须保持一致,事务所做的操作要符合数据库定义的完整性约束。
-
隔离性(Isolation):事务的执行不受其他事务的干扰,每个事务都感觉自己在独立操作数据库,避免了并发执行事务时可能出现的数据一致性问题。
-
持久性(Durability):一旦事务提交成功,其所做的修改会被永久保存在数据库中,即使在系统发生故障的情况下也能够恢复。
数据库事务的使用可以确保复杂的数据库操作过程中数据的正确性和一致性,尤其在多用户并发访问数据库的情况下,事务的隔离性十分重要,避免了数据混乱和冲突的问题。
事务处理过程
如在 MySQL 数据库中添加销售订单,示例:
添加销售订单的步骤如下:
从
orders
表中'查询'最新的销售订单号,并使用下一个销售订单号作为新的销售订单号。
接下来,在
orders
表中"插入"一个新的销售订单。然后,获取新插入的销售订单号
之后,将新的销售订单项插入到带有销售订单号的
orderdetails
表中最后,从
orders
和orderdetails
表中选择数据以确认更改
若上述过程由于 表级锁
或其他原因 而执行失败,会得到一个空白的 order 表,此时 MySQL Transaction 出现来补救程序。
事务提供了数据一致性和完整性的保证,确保多个操作在逻辑上被当作一个整体进行处理,避免了数据异常和不一致的情况。
事务可以用于处理复杂的操作,如银行转账、订单处理等。在并发操作中,还可以锁定共享资源,以避免数据冲突和并发访问问题。
事务的使用
使用方式
在 MySQL 中,可以通过显式事务和隐式事务两种方式来使用事务。
显式事务
显式事务需要用户明确地使用事务控制语句来开启、提交或回滚事务。
- 开启事务 :使用
START TRANSACTION
或BEGIN
语句来开启一个事务。 - 提交事务 :使用
COMMIT
语句来提交事务,使事务中的所有修改成为永久性的。 - 回滚事务 :使用
ROLLBACK
语句来回滚事务,撤销事务中的所有修改。
隐式事务
在 MySQL 中,如果设置了 AUTOCOMMIT
为 1 (默认值 ),则每条SQL语句都会被自动提交为一个独立的事务。关闭自动提交可以通过设置 AUTOCOMMIT
为 0 或使用显式事务来实现。
事务的隔离级别
事务的隔离级别决定了事务之间可见的数据范围和冲突程度。MySQL支持以下四种隔离级别:
-
READ UNCOMMITTED(读未提交):允许事务读取未被其他事务提交的变更,这可能导致脏读、不可重复读和幻读。
-
READ COMMITTED(读已提交):确保事务只能读取到其他事务已经提交的变更,这可以避免脏读,但不可重复读和幻读仍可能发生。
-
REPEATABLE READ(可重复读):确保在同一个事务中多次读取同样记录的结果是一致的,可以避免脏读和不可重复读,但幻读仍可能发生。MySQL的默认隔离级别。
-
SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,避免脏读、不可重复读和幻读,但会严重影响性能。
事务使用步骤
MySQL 中使用事务可以通过以下步骤完成:
-
开始事务 :使用
BEGIN
、START TRANSACTION
或者SET autocommit=0
开启一个新的事务。 -
执行 SQL 查询:在事务中执行一系列的 SQL 查询语句,这些查询会修改数据库中的数据。
-
判断事务成功或失败:根据执行查询的结果判断事务是否成功。
-
如果所有的查询都成功 执行,那么可以选择提交(commit)事务 ,使得修改的数据永久保存到数据库 中,使用 COMMIT 语句提交事务。
-
如果任何一个查询失败或者遇到错误 ,可以选择回滚(Rollback)事务 ,撤销之前的所有修改 ,使用
ROLLBACK
语句回滚事务。
Transaction 语句
MySQL 提供了一些语句来控制事务,可以手动控制事务的开始、提交和回滚:
-
开始事务:
BEGIN TRANSACTION
、BEGIN
、BEGIN WORK
-
提交事务的所有操作并使其修改数据:
COMMIT
-
回滚当前事务并撤销修改:
ROLLBACK
-
开启/关闭 当前事务的自动启动:
SET autocommit
sql
-- 关闭 autocommit 模式
SET autocommit = 0 | OFF ;
-- 开启 autocommit模式
SET autocommit = 1 | ON ;
当 autocommit
选项开启时(默认情况下),每个单独的 SQL 语句都会自动成为一个事务,并立即提交。
COMMIT
将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。ROLLBACK
表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作(对数据库的更新操作)全部撤销,回滚到事务开始时的状态。
示例
假设有两个表:customers
表和 orders
表。customers
表存储客户信息,orders
表存储客户订单信息。要创建一个事务,在插入新客户信息的同时插入相关的订单信息。
sql
'''创建表后,开启事务并插入数据'''
BEGIN TRANSACTION;
INSERT INTO customers (name, email)
VALUES ('John Doe', 'john@example.com');
SET @customer_id = LAST_INSERT_ID();
INSERT INTO orders (customer_id, product, quantity)
VALUES (@customer_id, 'Product A', 5);
COMMIT;
首先开启了一个事务(START TRANSACTION
)。然后在 customers
表中插入一条新的客户记录,并使用 LAST_INSERT_ID()
函数获取到插入的客户的 ID,并保存到变量 @customer_id
中。
接下来在 orders
表中插入一条关联到该客户的订单记录。
最后,提交事务(COMMIT
),将修改的数据永久保存到数据库中。
如果在执行事务期间发生任何错误或者需要回滚事务,可以使用 ROLLBACK
语句进行回滚操作。
总结
MySQL 事务是数据库管理中的重要机制,它通过 ACID特性 确保了数据的一致性和完整性。在实际应用中,应根据具体需求选择合适的事务隔离级别,并合理使用事务控制语句来管理事务,以提高数据处理的效率和可靠性。