Welcome to MySQL Workbench:MySQL 事务

本文介绍了MySQL事务的概念,强调其在确保数据完整性和一致性中的关键作用。文章详细阐述了开始、提交、回滚事务的语句,以及设置保存点的操作。此外,还讨论了ACID原则、死锁、隔离级别、日志管理和性能优化等相关主题,提供了关于事务大小、避免长时间事务、错误处理和日志管理的实践建议。
摘要由CSDN通过智能技术生成

事务是数据库管理系统中的一个基本概念,它是一系列操作,要么全部执行,要么全部不执行。这确保了数据的完整性和一致性。
在MySQL中,事务主要用于处理可能涉及多个步骤的复杂操作,例如在银行转账中从一个账户转移资金到另一个账户。如果其中一个步骤失败,则整个操作应被回滚,以确保数据的一致性。
MySQL的事务控制语句主要包括以下几种:

  1. START TRANSACTION; - 开始一个新的事务。
  2. COMMIT; - 提交当前事务,使其更改永久化。
  3. ROLLBACK; - 回滚当前事务,撤销其更改。
  4. SAVEPOINT identifier; - 在事务中设置一个保存点。这可以用于稍后回滚到事务的某个特定点,而不是全部回滚。
  5. ROLLBACK TO identifier; - 回滚到事务中的一个特定保存点。
    使用事务时,应遵循ACID原则:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这确保了事务的可靠性和数据的完整性。
    例如,考虑一个简单的转账场景:
  6. START TRANSACTION;
  7. 从源账户扣除金额。
  8. 将金额添加到目标账户。
  9. 如果以上两步都成功,则 COMMIT;;如果其中一步失败,则 ROLLBACK;
    这将确保数据的完整性和一致性,无论发生什么情况。在处理事务时,还有几点需要注意:
  10. 死锁:当两个或更多的事务在资源上相互等待时,就会发生死锁。例如,事务A锁定了资源1并尝试访问资源2,而事务B锁定了资源2并尝试访问资源1。为了避免死锁,可以设置超时时间,或者使用特定的死锁解决策略。
  11. 隔离级别:不同的事务隔离级别会影响并发事务的行为和可能遇到的问题,如脏读、不可重复读和幻读。根据应用的需要选择合适的隔离级别是很重要的。
  12. 日志:为了确保事务的持久性和恢复能力,需要使用合适的日志记录策略。这包括二进制日志、重做日志和撤销日志等。
  13. 性能:事务可能会导致大量的磁盘I/O操作,特别是对于大型数据库。优化事务的大小和持续时间,以及使用适当的索引和查询优化技术,可以显著提高性能。
  14. 回滚策略:当事务失败时,需要考虑如何回滚事务以保持数据的一致性。这可能涉及到复杂的逻辑,特别是当涉及到多个相关操作时。
    总的来说,正确地使用和管理事务是数据库管理的重要部分,需要深入理解事务的特性和行为,以及如何根据具体的应用需求来使用它们。除了上述提到的注意事项,还有以下几点关于事务处理的建议:
  15. 最小化事务大小:尽量使每个事务尽可能小并专注于一个任务。这可以减少事务的开销,并提高系统的整体性能。
  16. 避免长时间的事务:长时间运行的事务可能会锁定大量的资源,影响其他事务的执行。如果一个事务需要执行很长时间,考虑将其分解为多个小事务。
  17. 错误处理:在事务处理过程中,应妥善处理可能出现的错误。例如,如果事务中的某个步骤失败,应立即回滚事务,而不是继续执行后续步骤。
  18. 日志管理:确保对事务日志进行妥善管理。定期备份日志,并定期检查日志以查找可能的错误或问题。
  19. 监控和调优:定期监控数据库的事务性能,并基于监控结果进行调优。这可能包括调整事务的大小、优化查询语句、调整隔离级别等。
    通过遵循这些建议和注意事项,可以更有效地管理和利用事务,从而提高数据库的性能和可靠性。
    在这里插入图片描述

MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交

CREATE TABLE test_NO1(
test_NO1_id INT NOT NULL AUTO_INCREMENT,
test_NO1_title VARCHAR(100) NOT NULL,
test_NO1_author VARCHAR(40) NOT NULL,
test_NO1_date DATE,
PRIMARY KEY ( test_NO1_id )
)ENGINE=InnoDB;

drop table test_no1;


INSERT INTO test_NO1 
    (test_NO1_title, test_NO1_author, test_NO1_date )
    VALUES
    ("programb", "welcome to programb", NOW());
    
    
select * from test_NO1;


INSERT INTO test_NO1 
    (test_NO1_title, test_NO1_author, test_NO1_date )
    VALUES
    ("programb2", "welcome to programb2", NOW());
    
INSERT INTO test_NO1 
    (test_NO1_title, test_NO1_author, test_NO1_date )
    VALUES
    ("programb3", "welcome to programb3", NOW());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值