MySQL:Transaction 事务

概览

数据库事务(Database Transaction)是由一系列数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部回滚到事务开始前的状态,以保证数据的一致性和完整性。

MySQL 作为一种广泛使用的关系型数据库管理系统,也支持事务处理。MySQL 中的事务(Transaction) 是指一组 SQL 查询,它们被视为一个独立的工作单元,在执行过程中要么全部成功提交(Commit) ,要么全部失败回滚(Rollback)

ACID 特性

事务通常具备以下四个基本特性,通常简称为 ACID 特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部成功提交,要么全部失败回滚,不存在部分提交的情况。

  2. 一致性(Consistency):事务执行前后,数据库的状态必须保持一致,事务所做的操作要符合数据库定义的完整性约束。

  3. 隔离性(Isolation):事务的执行不受其他事务的干扰,每个事务都感觉自己在独立操作数据库,避免了并发执行事务时可能出现的数据一致性问题。

  4. 持久性(Durability):一旦事务提交成功,其所做的修改会被永久保存在数据库中,即使在系统发生故障的情况下也能够恢复。

数据库事务的使用可以确保复杂的数据库操作过程中数据的正确性和一致性,尤其在多用户并发访问数据库的情况下,事务的隔离性十分重要,避免了数据混乱和冲突的问题。

事务处理过程

如在 MySQL 数据库中添加销售订单,示例:

添加销售订单的步骤如下:

  1. orders 表中'查询'最新的销售订单号,并使用下一个销售订单号作为新的

    销售订单号。

  2. 接下来,在 orders 表中"插入"一个新的销售订单。

  3. 然后,获取新插入的销售订单号

  4. 之后,将新的销售订单项插入到带有销售订单号的 orderdetails 表中

  5. 最后,从 ordersorderdetails 表中选择数据以确认更改

若上述过程由于 表级锁 或其他原因 而执行失败,会得到一个空白的 order 表,此时 MySQL Transaction 出现来补救程序。

事务提供了数据一致性和完整性的保证,确保多个操作在逻辑上被当作一个整体进行处理,避免了数据异常和不一致的情况。

事务可以用于处理复杂的操作,如银行转账、订单处理等。在并发操作中,还可以锁定共享资源,以避免数据冲突和并发访问问题。

事务的使用

使用方式

在 MySQL 中,可以通过显式事务和隐式事务两种方式来使用事务。

显式事务

显式事务需要用户明确地使用事务控制语句来开启、提交或回滚事务。

  • 开启事务 :使用 START TRANSACTIONBEGIN 语句来开启一个事务。
  • 提交事务 :使用 COMMIT 语句来提交事务,使事务中的所有修改成为永久性的。
  • 回滚事务 :使用 ROLLBACK 语句来回滚事务,撤销事务中的所有修改。
隐式事务

在 MySQL 中,如果设置了 AUTOCOMMIT1默认值 ),则每条SQL语句都会被自动提交为一个独立的事务。关闭自动提交可以通过设置 AUTOCOMMIT0 或使用显式事务来实现。

事务的隔离级别

事务的隔离级别决定了事务之间可见的数据范围和冲突程度。MySQL支持以下四种隔离级别:

  1. READ UNCOMMITTED(读未提交):允许事务读取未被其他事务提交的变更,这可能导致脏读、不可重复读和幻读。

  2. READ COMMITTED(读已提交):确保事务只能读取到其他事务已经提交的变更,这可以避免脏读,但不可重复读和幻读仍可能发生。

  3. REPEATABLE READ(可重复读):确保在同一个事务中多次读取同样记录的结果是一致的,可以避免脏读和不可重复读,但幻读仍可能发生。MySQL的默认隔离级别。

  4. SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,避免脏读、不可重复读和幻读,但会严重影响性能。

事务使用步骤

MySQL 中使用事务可以通过以下步骤完成:

  1. 开始事务 :使用 BEGINSTART TRANSACTION 或者 SET autocommit=0 开启一个新的事务。

  2. 执行 SQL 查询:在事务中执行一系列的 SQL 查询语句,这些查询会修改数据库中的数据。

  3. 判断事务成功或失败:根据执行查询的结果判断事务是否成功。

  • 如果所有的查询都成功 执行,那么可以选择提交(commit)事务 ,使得修改的数据永久保存到数据库 中,使用 COMMIT 语句提交事务。

  • 如果任何一个查询失败或者遇到错误 ,可以选择回滚(Rollback)事务撤销之前的所有修改 ,使用 ROLLBACK 语句回滚事务。

Transaction 语句

MySQL 提供了一些语句来控制事务,可以手动控制事务的开始、提交和回滚:

  • 开始事务:BEGIN TRANSACTIONBEGINBEGIN 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特性 确保了数据的一致性和完整性。在实际应用中,应根据具体需求选择合适的事务隔离级别,并合理使用事务控制语句来管理事务,以提高数据处理的效率和可靠性。

相关推荐
woshilys14 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi15 分钟前
SQL注入的那些面试题总结
数据库·sql
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu