`

sql基础-事务

阅读更多

sql基础

事务:为了保持逻辑数据的一致性和恢复性,即一个逻辑操作内,所有的操作单元要么做,要么全部不做。

锁:当多个用户同时访问同一个数据库资源时,对访问的先后秩序进行管理和安排的一种机制,是实现事务的技术,保证数据库的安全读写。

死锁:上述锁机制中,因为不同事务在同一时间抢占相同的资源而导致的事务挂起等待,导致数据库在死锁期间造成的极大负荷和资源浪费。

 

和其他基础sql tutorial讲解sql事务一样,银行取钱中,取出100过程中,如果成功则账户减少100;如果中途机器故障则返回不扣。事务就是:要么全部执行,要不一点不执行回归原始状态。

 

1.特性:

原子性atomicity:一个事物内的所有操作是一个整体不可在分割,要么全部执行要么全部不执行。

一致性consistency:事务结束后,所有的数据状态是正确的。

隔离型isolation:不同的事务之间互不干扰,处理的都是任何其他事务处理前或者后的数据状态。

持久性persistence:事务提交后,数据恒久的不可回滚的。

 

2.提交回滚:

在不同环境下,可能不同数据库在sql语句执行后,需要显示的commit提交,rollback回滚。

 

3.锁:

我们想象下,在多个用户都是用事务同时访问相同资源时候,会造成以下问题:

 1)丢失更新:多个用户同时对一个数据资源进行更新操作,必定会产生覆盖的情况,最后自由一个结果,可能造成数据读写异常

 2)不可重复读:用户A在一个事务中,前后多次读取同一条数据,但是在此时刻用户B对该数据更新,造成用户A前后读取数据不一致;

 3)脏读:第一个事务正在读取第二个事务正在处理的数据,如果第二个事务没有完成所有的更新,第一个事务继续对这个结果集查询的数据将一半是更新过的一般还没有更新,这样的结果逻辑错误。

 4)幻读:用户A在一个事务中,前后多次读取同一条数据,但是在此时刻用户B对该数据库增加或者删除,造成用户A前后读取数据丢失或者增加;

 

 5)锁就是为了解决以上4中issue而产生的数据库事务处理机制,它对在一个事务所保护的所有一系列操作的集合进行一个包装,其他事务不能插足,即锁定(锁)。

  <1>.共享锁(s 表级):称之为只读锁,可以并发读取数据,但是不能修改数据。就是当数据资源上有共享锁时候,所有事务都不能对这个资源进行更新,只能读取。直到数据读取完成,共享锁释放。

  <2>.排它锁(x 行级):称之为独占锁、写锁。如果对数据资源进行增删改查操作,不再允许任何其他事务进行任何操作, 直到锁释放。

  <3>.更新锁(U):防止死锁的模式。两个事务对一个数据资源进行先读取在更新的操作,使用共享锁或者排它锁会出现死锁现象,使用更新锁能避免。资源的更新锁依次只能分配给一个事务,任何对资源进行修改,则编程排它锁,否则共享锁。

  <4>.意向锁:在层次架构的底层资源上(行、表)获取共享锁、排它锁、更新锁。例如表级防止了意向共享锁就表示事务要对表的页或者行使用共享锁。在表的一行上放置意向锁,可以放置其他事务获取其他不兼容的锁。它可提高性能,因为数据库引擎不需要检测资源的每一行每一列,就能判断是否可以获取到该资源的兼容锁。意向共享锁,意向排它锁,意向排他共享锁。

  <5>.架构锁:放置修改表结构时,并发访问的锁。

  <6>.大容量更新锁:允许多个县策划那个将大量的数据并发迁移到同一个数据表中,在加载时候不允许其他线程访问该表。

 

以上六种锁中,1.2.3是使用最频繁的。一般的数据库事务读操作使用共享锁,而写操作使用排它锁,在视具体业务而定。

 

4.死锁

死锁,就是事务将资源锁定而不释放,导致其他的事务无法使用该资源而出现的系统等待拥挤或者超时崩溃。

出现的场景:

 step1.事务A:先更新表a--延时1s--更新表b

 step2.同时有事务B:先更新表b--延时1s--更新表a

 step3.在1s之内同时执行事务A、B,出现死锁。

 因为在1s的延时过程中,事务给a更新时加排它锁1,在更新b是请求b排它锁2,而b已经占用排它锁2,同时更新a也要请求a的排它锁1,这样相互等待而两个事务又不愿意释放各自锁的情况下,永远在等待这个死循环。

 当然,数据库没有出现无限等待的情况,因为数据库引擎会定时检测一旦有死锁,将会按照一定规则,牺牲一个事务的代价释放所占用的锁而解决。被牺牲的事务回滚。

 死锁的牺牲规则,认为可设置优先级,优先级低的先牺牲。相同优先级的随机。

 

死锁是一种大量消耗时间资源的罪魁祸首,在大型系统应用中,虽然不可比避免,但是应当尽量优化sql,减少死锁:

  <1>更新锁不悔出现死锁。

  <2>在一个事务中,尽量不处理过多的复杂逻辑。

  <3>设置事务自动提交。

  <4>减少数据库并发访问。

  <5>使用分区表,视图。将数据放置在不同的磁盘或者文件组中,分散数据资源。

  <6>设计表时,优化逻辑,不要太复杂。

  <7>事务隔离级别尽量低。

在实际生产中,不会被动等待数据库本身的死锁检查机制来处理死锁,可以主动设置超时时间,这样不仅处理死锁,还处理了系统因为其他原因导致的等待时间超时而主动撤销事务,释放资源。并且在程序中手动这时回滚逻辑,保证数据的一致性。

 

5.事务隔离级别

一个事物与其他事务进行的资源、数据的更改相隔离的程度。隔离级别是从允许并发的副作用来描述数据库事务。

  1)read uncommittde:未提交读,最低隔离级别,A事务可以读取到B事务正在更改还没有提交的数据。对应锁的脏读。

  2)read committed:已提交读,它是sql默认的隔离级别,A事务只能读到B事务提交前或者提交后的数据。不会出现脏读,但会出现幻读,不可重复读。

  3)repeatable read:可重复读,不能读取到事务正在处理的数据,也不能修改事务正在处理的数据,不会出现脏读,不可重复读,但是会幻读。

  4)serialization:序列化,最高的事务隔离级别,一个事物的会将整张数据表锁定导致只能看到事务处理前的数据。不会出现脏读、不可重复读、幻读。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    sql-map-2.dtd和sql-map-config-2.dtd

    在SqlMap配置文件中,我们可以定义数据源、事务管理器、SQL语句等信息。例如,`&lt;sqlMap&gt;`元素用于包含具体的SQL语句,`&lt;select&gt;`、`&lt;insert&gt;`、`&lt;update&gt;`和`&lt;delete&gt;`元素则分别用于定义查询、插入、更新和删除操作...

    SQL2022-SSEI-Dev.rar

    1. **T-SQL语言**:SQL Server的查询语言,用于创建、修改和操作数据库对象,执行查询和事务处理。 2. **索引**:提高查询性能的关键元素,包括B树索引、聚集索引和非聚集索引等类型。 3. **存储过程**:预编译的...

    sql server 2012 T-SQl基础教程 源码和示例数据库

    《SQL Server 2012 T-SQL基础教程——源码与示例数据库》 本教程专注于Microsoft SQL Server 2012中的Transact-SQL(T-SQL)语言,这是SQL Server的主要查询语言,用于数据操作、查询、存储过程和数据库对象的编程...

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    【MySQL面试题】在面试MySQL相关的职位时,面试官可能会问到一系列关于数据库基础、SQL语法、事务处理、索引优化以及性能调优的问题。以下是一些可能的面试重点: 1. **数据库基本概念**: - 数据库是用于存储和...

    ibatis-sqlmaps-2_cn

    除了基础功能外,教程还会涉及IBATIS的高级特性,比如缓存机制,这能提高应用的性能。此外,还有关于事务管理和异常处理的内容,这些都是实际开发中不可忽视的部分。 通过《ibatis-sqlmaps-2_cn》,你不仅可以学习...

    浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 .docx

    LSN是追踪事务执行顺序和数据修改的关键,它为日志恢复提供了基础。每个日志记录包含了事务的详细信息,如事务开始和结束、数据插入、更新和删除、分配或释放页、以及表和索引的创建或删除等操作。 当SQL Server...

    iBATIS-SqlMaps-2-Tutorial_cn

    总的来说,《iBATIS-SqlMaps-2-Tutorial_cn》是一本全面覆盖iBATIS基础和进阶内容的教程,它不仅适合初学者入门,也对有一定经验的开发者有很好的参考价值。通过阅读本书,你可以深入理解iBATIS的工作原理,掌握其...

    iBATIS-SqlMaps-2 PDF文档资料(日文)

    教程《iBATIS-SqlMaps-2 Tutorial_ja.pdf》可能包含以下内容:基础安装和配置、SqlMap配置详解、数据源的设置、SQL映射文件的编写、动态SQL的使用、事务管理、结果集映射、参数映射、自定义类型处理器、异常处理以及...

    sql学习-sql练习-SQL必知必会

    SQL学习是数据科学、数据库管理、数据分析等领域不可或缺的基础技能。"sql学习-sql练习-SQL必知必会"这个主题涵盖了从SQL的基本概念到高级用法的各种知识点,旨在帮助初学者快速掌握SQL,并通过实践提升技能。 首先...

    learn-sql-the-hard-way-笨方法学sql

    通过这个课程,读者将不仅学会SQL的基础语法,还能掌握处理复杂查询、优化数据库性能以及设计高效数据库结构的技能。实践是学习SQL的关键,这本书通过大量的例子和练习,鼓励读者动手操作,从而真正理解并掌握SQL这...

    SQL 92-ISO ANSI

    SQL 1992标准旨在定义一个统一的数据库语言标准,用于数据定义、数据操纵、数据控制以及事务处理等操作。它参考了ISO/IEC 10646和ISO 8601等标准,对字符集和日期时间格式等方面进行了规定。 #### 2. **定义、符号...

    sql---基本练习.rar

    这个压缩包"sql---基本练习.rar"显然包含了一些SQL基础练习,旨在帮助初学者掌握和巩固SQL的基本概念和操作。让我们详细探讨一下SQL的核心知识点: 1. 数据库与表: SQL主要用于操作数据库,其中数据库是由一张或...

    sql2000-----chm

    通过深入学习和实践这些内容,你将能够熟练地在SQL Server 2000环境中进行数据管理,并为向更高版本的SQL Server或其他数据库系统迁移打下坚实基础。同时,CHM文件的使用也能提升你在日常工作中查找和解决问题的效率...

    SQL SERVER-2008从入门到精通.pdf

    《SQL SERVER 2008从入门到精通》是一本专为初学者...通过深入学习这些知识点,读者可以逐步提升在SQL Server 2008上的技能,从基础的数据库管理到复杂的业务逻辑处理,为成为数据库管理员或数据分析师奠定坚实的基础。

    标准SQL和transact-sql之比较学习

    总的来说,标准SQL是数据库操作的基础,而Transact-SQL是在此基础上进行的增强和扩展,以适应SQL Server的需求。理解两者的区别对于开发针对SQL Server的应用程序至关重要。通过深入学习和实践,开发者可以充分利用T...

    SQLServer Transact SQL全集--很实用

    这些Transact-SQL语句构成了SQLServer数据库管理的基础,通过它们,你可以执行各种数据库操作,从简单的数据检索到复杂的业务逻辑实现。掌握这些语句对于任何SQLServer数据库管理员或开发者来说都是至关重要的。

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    SQL SERVER 2008 T-SQL 基础

    《SQL SERVER 2008 T-SQL基础》是一本由微软出版社出版的书籍,主要针对SQL Server 2008中的Transact-SQL(T-SQL)语言进行深入浅出的讲解。T-SQL是SQL Server的核心组件,用于数据查询、数据操纵、存储过程编写以及...

    SQL教程-学习SQL

    - 事务(Transactions):SQL Server支持事务处理,确保数据的一致性和完整性,事务包括BEGIN、COMMIT和ROLLBACK等命令。 - 数据库角色和权限(Roles and Permissions):用于控制用户对数据库资源的访问权限,有助...

Global site tag (gtag.js) - Google Analytics