热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

想到数据库的事务问题,我横竖睡不着

longtimenosee!!距离上一次写东西已经已经是上一次了,是有写一些东西的必要了。特别是在遇到数据库的时候,脑子里

long time no see!!

距离上一次写东西已经已经是上一次了,是有写一些东西的必要了。

特别是在遇到数据库的时候,脑子里歪歪斜斜的冒出两个字“事务”,我横竖睡不着,想要好好把事务这个小石子从鞋里翻出来。

事务很重要,有多重要。

互联网大数据时代,数据是最基本的,没有数据,互联网就是空谈。

那么保证数据操作的安全,就是互联网的核心。

操作数据就需要操作数据库,而事务就成了保证数据库数据安全的护城河。


一、什么是事务?

事务是操作数据库的基本单位,操作数据库一次,也就进行了一次事务。

在我的理解,事务由一个,或多个sql语句构成。

一次数据库事务的执行有成功有失败,就会存在一个问题。

例如有A,B两条sql语句同时对100块进行操作,A执行成功,100-100=0。

异常示例

而B需要实现100-100+100=100的操作时,出现异常,导致,B执行失败。

如果发生在银行,银行损失100块,如果发生在用户,用户损失一百块。

事务的存在解决了这个问题,AB两个sql都存在于一个事务中。

事务中的sql要么都执行成功,要么都失败。

回滚示例

B失败,A也不会成功,0元会回滚到100块,也就是没有操作的原始状态。

数据库不能没有事务, 就像西方不能没有耶路撒冷。


二、事务的特性

事务的特性可以理解为事务的特点,以下四点。

1.原子性:原子是万事万物最小的单位,所以对数据库而言,事务就是最小的操作单位,不可再拆分。事务中的sql语句要么一起失败,即事务提交(commit)和事务回滚(rollback)。

2.隔离性:不允许多个线程同时操作一个session的数据。例如a,b两个人,a在操作数据的时候还未提交,b就不能操作。a和b同时处在两个不同的事务。

3.持久性:事务一旦提交,就不能回滚。

4.一致性:和能量守恒一样,事务提交前后需要保证数据守恒,增加的和减少的需要一致。

事务的这四个特性,保证了操作数据库数据的安全性。


三、事务的并发问题

只有一个线程操作数据,肯定没有什么问题。而一旦线程变多,就需要考虑并发问题。

何为并发问题?

例如还是100块,C线程进行了+5的操作,此时,C还没有提交,而D线程做了-5的操作,并且提交了。

最后提交过后的C看到还是100块。

并发会造成数据覆盖,所以要解决并发问题,并发问题有以下几种。

AB线程,A负责写,B负责读。

脏读:A正在修改数据,还没有提交,此时B读取了该数据。A如果回滚,B读到的就是一个不存在的数据。脏读也就是读取到了别人还未提交的数据。

脏读示例

不可重复读:B第一次读到了原始数据,接着A开始修改数据,B再次读取,则读到了修改后的数据,前后两次数据不一致。

不可重复读示例

幻读:AB线程同时对某个资源进行操作。A插入一个数字1,此时B线程删除了数字1。最后A发现数字1不见了,像是产生了幻觉,什么鬼!!

幻读读示例

需要知道:不可重复读侧重 读-读,幻读侧重 读-写

四、事务的隔离等级

为了解决以上的问题,事务有应对的措施,也就是隔离等级,隔离等级如下:

读未提交(Read Uncommitted):最低的隔离等级,顾名思义,该隔离等级下,线程可以读到其他线程还没有提交的数据。虽然支持超高并发操作,但数据库操作一般不用这个等级,没什么用。

读已提交(Read-commited):这是大部分数据库正在使用的隔离等级(oracle),只能读到其他线程提交了的数据,避免了脏读,但仍然会出现不可重复度和幻读问题。

可重复读(Repeatable Read):mysql默认的事务隔离等级。处在该隔离等级,读到的数据都是一致的。原理是事务执行期间,会锁定该事务引用的所有行,其他事务不能做修改。但仍然存在幻读。

串行化(serializable):最高级别的隔离等级,解决了所有并发问题,但速度极慢。

事务的隔离等级不是越高越好,也不是越低越好。越高,虽然数据安全,但是牺牲了性能,越低,性能好了,数据的安全性得不到保证。

应针对不同的环境应该设置不同的隔离等级,例如对于银行系统和其他后台管理系统事务隔离等级肯定有出入。

此外,不同的数据库隔离等级是不同的,oracle和mysql一个是Read-commited,一个是Repeatable Read。oracle抛弃了一些安全性能,但提高了操作性能。

作为程序从业人员,一般我们不去修改数据库默认的隔离等级。因为数据库的隔离等级一定是设计者经过了多方的考虑,得到的一个最优解。


推荐阅读
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • Oracle 用户锁定问题及解决方法
    本文介绍了如何在 Oracle 数据库中检查和处理用户锁定问题,包括查询被锁定的用户、解锁用户以及调整登录失败次数限制的方法。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 在使用达梦数据库时,管理员可能会遇到连接频繁中断或特定SQL语句语法错误的问题。这些问题通常源于开发人员在创建对象时的不规范操作。为了解决这些问题,建议对数据库配置进行优化,并确保所有SQL语句符合达梦数据库的标准语法。此外,定期检查和维护数据库连接参数,以及对异常日志进行详细分析,也有助于及时发现并解决问题。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
author-avatar
郭倩尔偏执起来不是人_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有