当前位置: 首页 > news >正文

上海网站制作策制作一个简单的网站

上海网站制作策,制作一个简单的网站,ip查询网站,wordpress 公司网站MySQL事务:从原理到实践 引言 在现代数据库系统中,事务(Transaction)是确保数据一致性和完整性的核心机制。MySQL作为最流行的关系型数据库之一,其事务处理能力直接影响着应用程序的可靠性和性能。本文将深入探讨MyS…

MySQL事务:从原理到实践

引言

在现代数据库系统中,事务(Transaction)是确保数据一致性和完整性的核心机制。MySQL作为最流行的关系型数据库之一,其事务处理能力直接影响着应用程序的可靠性和性能。本文将深入探讨MySQL事务的方方面面,从基础概念到高级特性,帮助读者全面掌握MySQL事务的知识体系。

什么是事务?

事务是数据库管理系统执行过程中的一个逻辑单位,由一个或多个SQL语句组成。这些语句要么全部成功执行,要么全部失败回滚,不会出现部分执行的情况。

事务的典型场景

考虑一个银行转账的例子:

  • A账户向B账户转账100元
  • 需要从A账户扣除100元
  • 需要向B账户增加100元

这两个操作必须作为一个整体执行,任何一步失败都应该回滚整个操作,否则会造成数据不一致。

事务的ACID特性

ACID是事务必须满足的四个特性,这是数据库事务正确执行的四个基本要素:

1. 原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。MySQL通过undo log来保证事务的原子性。

2. 一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另一个一致性状态。数据的完整性约束不能被破坏。

3. 隔离性(Isolation)

多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰。MySQL通过锁机制和MVCC(多版本并发控制)来实现隔离性。

4. 持久性(Durability)

一旦事务提交,则其结果就是永久的,即使系统崩溃也不会丢失。MySQL通过redo log来保证事务的持久性。

MySQL事务的使用

开启事务

-- 方式1:显式开启事务
START TRANSACTION;
-- 或
BEGIN;-- 方式2:关闭自动提交
SET autocommit = 0;

提交事务

COMMIT;

回滚事务

ROLLBACK;

设置保存点

-- 设置保存点
SAVEPOINT savepoint_name;-- 回滚到保存点
ROLLBACK TO savepoint_name;-- 删除保存点
RELEASE SAVEPOINT savepoint_name;

完整示例

START TRANSACTION;-- 执行一些操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT after_deduct;UPDATE accounts SET balance = balance + 100 WHERE id = 2;-- 如果第二个操作失败,可以回滚到保存点
-- ROLLBACK TO after_deduct;-- 如果所有操作成功,提交事务
COMMIT;

事务隔离级别

MySQL提供了四种事务隔离级别,用于控制事务之间的隔离程度:

1. READ UNCOMMITTED(读未提交)

  • 最低的隔离级别
  • 允许读取尚未提交的数据变更
  • 可能导致脏读、不可重复读和幻读

2. READ COMMITTED(读已提交)

  • 允许读取并发事务已经提交的数据
  • 可以避免脏读
  • 但仍可能出现不可重复读和幻读

3. REPEATABLE READ(可重复读)

  • MySQL的默认隔离级别
  • 对同一字段的多次读取结果都是一致的
  • 可以避免脏读和不可重复读
  • 在MySQL中通过MVCC机制也可以避免幻读

4. SERIALIZABLE(可串行化)

  • 最高的隔离级别
  • 完全串行化的读写
  • 可以避免脏读、不可重复读和幻读
  • 但性能影响最大

设置隔离级别

-- 查看当前隔离级别
SELECT @@transaction_isolation;-- 设置会话级别的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

并发问题详解

1. 脏读(Dirty Read)

一个事务读取了另一个未提交事务修改的数据。

-- 事务A
START TRANSACTION;
UPDATE users SET age = 30 WHERE id = 1;
-- 未提交-- 事务B
START TRANSACTION;
SELECT age FROM users WHERE id = 1; -- 读到30(脏读)
COMMIT;-- 事务A
ROLLBACK; -- 回滚后age应该还是原值

2. 不可重复读(Non-Repeatable Read)

一个事务内多次读取同一数据,但读取结果不一致。

-- 事务A
START TRANSACTION;
SELECT age FROM users WHERE id = 1; -- 读到20-- 事务B
START TRANSACTION;
UPDATE users SET age = 30 WHERE id = 1;
COMMIT;-- 事务A
SELECT age FROM users WHERE id = 1; -- 读到30(不可重复读)
COMMIT;

3. 幻读(Phantom Read)

一个事务读取了几行数据,另一个并发事务插入了一些数据,再次读取时会发现多了一些原本不存在的记录。

-- 事务A
START TRANSACTION;
SELECT * FROM users WHERE age > 25; -- 返回2条记录-- 事务B
START TRANSACTION;
INSERT INTO users (name, age) VALUES ('Tom', 28);
COMMIT;-- 事务A
SELECT * FROM users WHERE age > 25; -- 返回3条记录(幻读)
COMMIT;

MVCC多版本并发控制

MVCC是MySQL InnoDB存储引擎实现隔离级别的一种方式,用于提高数据库并发性能。

MVCC的核心概念

  1. 隐藏字段
    • DB_TRX_ID:记录创建或最后修改该记录的事务ID
    • DB_ROLL_PTR:回滚指针,指向undo log记录
    • DB_ROW_ID:隐藏主键(如果表没有主键)
  2. Read View(读视图)
    • 事务开启时会生成数据库系统当前的一个快照
    • 记录并维护系统当前活跃的事务ID
  3. 版本链
    • 每次更新记录时,旧版本会被保存在undo log中
    • 通过回滚指针形成一个版本链

MVCC的工作原理

在READ COMMITTED和REPEATABLE READ隔离级别下,SELECT操作不会加锁,而是通过MVCC来实现:

  1. 每个事务都有一个唯一的事务ID
  2. 在读取数据时,只读取事务ID小于或等于当前事务ID的数据版本
  3. 对于删除操作,只是标记删除,不是真正删除
  4. 通过这种方式,读操作不会阻塞写操作,写操作也不会阻塞读操作

锁机制

MySQL使用锁机制来控制并发访问,主要包括:

1. 共享锁(S锁,Shared Lock)

  • 也称为读锁
  • 多个事务可以同时获得一个资源的共享锁
  • 获得共享锁的事务只能读取数据,不能修改数据
-- 添加共享锁
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;
-- MySQL 8.0+
SELECT * FROM users WHERE id = 1 FOR SHARE;

2. 排他锁(X锁,Exclusive Lock)

  • 也称为写锁
  • 一个资源只能被一个事务获得排他锁
  • 获得排他锁的事务既能读取数据,又能修改数据
-- 添加排他锁
SELECT * FROM users WHERE id = 1 FOR UPDATE;-- UPDATE、DELETE、INSERT会自动加排他锁
UPDATE users SET age = 30 WHERE id = 1;

3. 意向锁(Intention Lock)

  • 意向共享锁(IS):事务想要获得表中某几行的共享锁
  • 意向排他锁(IX):事务想要获得表中某几行的排他锁

4. 锁的粒度

  • 表级锁:锁定整张表
  • 行级锁:锁定特定的行
  • 页级锁:锁定特定的页(较少使用)

死锁

当两个或多个事务相互等待对方释放锁时,就会产生死锁。

死锁示例

-- 事务A
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 等待事务B释放id=2的锁
UPDATE accounts SET balance = balance + 100 WHERE id = 2;-- 事务B
START TRANSACTION;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
-- 等待事务A释放id=1的锁
UPDATE accounts SET balance = balance + 50 WHERE id = 1;

死锁检测与处理

  1. 死锁检测:InnoDB会自动检测死锁
  2. 死锁处理:选择回滚代价较小的事务
  3. 查看死锁信息SHOW ENGINE INNODB STATUS;

避免死锁的方法

  1. 按相同的顺序访问对象
  2. 尽量缩短事务的持续时间
  3. 使用较低的隔离级别
  4. 合理设计索引,避免扫描过多的记录

事务日志

MySQL使用两种日志来保证事务的ACID特性:

1. Undo Log(回滚日志)

  • 保证事务的原子性
  • 记录数据修改前的值
  • 用于事务回滚和MVCC

2. Redo Log(重做日志)

  • 保证事务的持久性
  • 记录数据修改后的值
  • 用于崩溃恢复

日志的工作流程

  1. 事务开始
  2. 记录undo log
  3. 更新数据页(在内存中)
  4. 记录redo log
  5. 事务提交
  6. redo log刷盘

性能优化建议

1. 合理设置隔离级别

根据业务需求选择合适的隔离级别,不要盲目使用最高级别。

2. 缩短事务时间

  • 尽快提交或回滚事务
  • 避免在事务中执行耗时操作
  • 将查询操作移出事务

3. 减少锁冲突

  • 合理设计索引,避免全表扫描
  • 按相同顺序访问资源
  • 使用乐观锁代替悲观锁(适用场景下)

4. 批量操作

将多个小事务合并为一个大事务,减少事务开销。

5. 监控和调优

-- 查看当前事务
SELECT * FROM information_schema.INNODB_TRX;-- 查看锁等待
SELECT * FROM information_schema.INNODB_LOCK_WAITS;-- 查看锁信息
SELECT * FROM information_schema.INNODB_LOCKS;

最佳实践

  1. 明确事务边界:清楚地知道事务的开始和结束
  2. 处理异常:确保异常情况下事务能够正确回滚
  3. 避免长事务:长事务会占用大量资源并增加锁冲突
  4. 读写分离:将读操作分离到从库,减少主库压力
  5. 使用连接池:避免频繁创建和销毁连接
  6. 定期监控:监控事务执行情况和锁等待情况

总结

MySQL事务是保证数据一致性和完整性的重要机制。理解事务的ACID特性、隔离级别、MVCC机制和锁机制,对于开发高性能、高可靠的数据库应用至关重要。在实际应用中,需要根据业务场景权衡性能和一致性,选择合适的隔离级别和锁策略,并持续监控和优化事务的执行效率。


文章转载自:
http://eiderdown.zpfr.cn
http://cluck.zpfr.cn
http://prodelision.zpfr.cn
http://cumulation.zpfr.cn
http://spur.zpfr.cn
http://tole.zpfr.cn
http://angulately.zpfr.cn
http://antiperistalsis.zpfr.cn
http://mts.zpfr.cn
http://enclises.zpfr.cn
http://kemalist.zpfr.cn
http://peiraeus.zpfr.cn
http://wreath.zpfr.cn
http://zoogeny.zpfr.cn
http://fasciolar.zpfr.cn
http://thinclad.zpfr.cn
http://caprificator.zpfr.cn
http://demonism.zpfr.cn
http://noradrenalin.zpfr.cn
http://milligal.zpfr.cn
http://milano.zpfr.cn
http://moselle.zpfr.cn
http://timberhead.zpfr.cn
http://hurtling.zpfr.cn
http://crucifixion.zpfr.cn
http://sideling.zpfr.cn
http://gondolet.zpfr.cn
http://lbj.zpfr.cn
http://effluence.zpfr.cn
http://tricerium.zpfr.cn
http://interspace.zpfr.cn
http://ditty.zpfr.cn
http://greenly.zpfr.cn
http://enduro.zpfr.cn
http://unchurched.zpfr.cn
http://inalienability.zpfr.cn
http://domesticable.zpfr.cn
http://disfurnishment.zpfr.cn
http://microprojector.zpfr.cn
http://imf.zpfr.cn
http://backvelder.zpfr.cn
http://romper.zpfr.cn
http://homeomorphous.zpfr.cn
http://oatmeal.zpfr.cn
http://wigging.zpfr.cn
http://excerpt.zpfr.cn
http://haphazard.zpfr.cn
http://isocephaly.zpfr.cn
http://supplicate.zpfr.cn
http://filmnoir.zpfr.cn
http://succinct.zpfr.cn
http://berwickshire.zpfr.cn
http://photosystem.zpfr.cn
http://systematizer.zpfr.cn
http://hellas.zpfr.cn
http://nejd.zpfr.cn
http://heterocharge.zpfr.cn
http://caponata.zpfr.cn
http://kentledge.zpfr.cn
http://croupier.zpfr.cn
http://exarticulation.zpfr.cn
http://moralless.zpfr.cn
http://chowry.zpfr.cn
http://teporingo.zpfr.cn
http://thrombin.zpfr.cn
http://lead.zpfr.cn
http://oligocene.zpfr.cn
http://xylitol.zpfr.cn
http://thermoluminescence.zpfr.cn
http://merlin.zpfr.cn
http://thirteenth.zpfr.cn
http://bawneen.zpfr.cn
http://labialized.zpfr.cn
http://gemsbok.zpfr.cn
http://deceiver.zpfr.cn
http://spermatogeny.zpfr.cn
http://retravirus.zpfr.cn
http://plattdeutsch.zpfr.cn
http://epopee.zpfr.cn
http://natter.zpfr.cn
http://peccant.zpfr.cn
http://butyraldehyde.zpfr.cn
http://paddleboard.zpfr.cn
http://quadrupedal.zpfr.cn
http://bacteremic.zpfr.cn
http://negentropy.zpfr.cn
http://krutch.zpfr.cn
http://ratguard.zpfr.cn
http://radon.zpfr.cn
http://furunculosis.zpfr.cn
http://extraversive.zpfr.cn
http://polyphemus.zpfr.cn
http://boing.zpfr.cn
http://subinfeudation.zpfr.cn
http://scarification.zpfr.cn
http://trilemma.zpfr.cn
http://icaaaa.zpfr.cn
http://dentilingual.zpfr.cn
http://jointure.zpfr.cn
http://csf.zpfr.cn
http://www.dt0577.cn/news/112917.html

相关文章:

  • 免费做电脑网站seo的概念
  • 深圳网站建设公司报价单免费广告推广软件
  • 做口腔科网站教程seo推广排名网站
  • 企业建设网站策划案最吸引人的引流话术
  • 网站ui设计师南通企业网站制作
  • 做网站 用 显示器关键字挖掘爱站网
  • 广州人才网seo网站优化服务
  • 普升高端品牌网站建设链接网
  • 网站建设与管理维护 大学论文新冠疫情最新情况
  • 搭建网站价格哈尔滨最新疫情
  • 商标设计网站图重庆网站排名提升
  • 兰州市委网站百度指数搜索榜
  • WordPress和哪个好用企业网站排名优化
  • 三合一建站网站b站黄页推广软件
  • 大悟网站建设百度指数是搜索量吗
  • 郑州疫情防控指挥部搜索引擎排名优化
  • 网站源码怎么用头条广告入口
  • 个人接做网站多少钱中小企业网络营销现状
  • 怎么看网站做没做seo河北百度seo关键词排名
  • 用php做网站网络营销的基本特征
  • 网站建设基本话术厦门网站搜索引擎优化
  • 武汉响应式网站定制开发seo知识培训
  • 可以做网站的域名后缀网络营销网站推广方法
  • 海燕网站建设公司谷歌搜索引擎首页
  • 有一个网站怎么做cpc淘宝关键词排名是怎么做的
  • 卢湾网站建设最新中国新闻
  • 怎样看一个网站的浏览量营销引流都有什么方法
  • magento网站建设seo官网
  • 建网站最少需要多少钱深圳小程序建设公司
  • 如何验证网站网站统计数据