linux MySQL事务

事务是数据库中很重要的一方面,是保证操作的执行完整性。

目录

一、事务的概述

二、事务的作用

三、事务的特点

四、事务的应用

五、事务的管理

六、总结

 

 

一、事务的概述

    1.事务的概念

      事务是数据库管理系统中的一个重要概念,用于保证数据的一致性和完整性。事务通常包括一组数据库操作命令,这些命令要么全部执行,要么全部回滚,以保证数据的一致性。事务是并发控制的最小单元,适用于多用户同时操作的数据库系统场景,如银行、保险公司及证券交易系统等。事务具有ACID属性,即原子性、一致性、隔离性和持久性。MySQL提供了丰富的事务支持,包括隐式和显式事务,以及多版本并发控制等机制,可以帮助开发人员构建高效、可靠的数据库应用程序。

    2.事务的背景   

      事务的背景可以追溯到数据库系统的早期,当时的主要应用场景是金融、保险、证券等领域。在这些领域中,数据的准确性和一致性非常重要,因此需要一种机制来确保数据的完整性。在多用户并发访问数据库的情况下,如果不加控制地进行数据操作,就会导致数据不一致的问题。例如,在银行系统中,如果一个用户在取款之前查询余额,然后另一个用户在这之后向该账户汇款,那么第一个用户取款时就会出现余额不足的情况,这会影响系统的可靠性和安全性。

      因此,为了解决这些问题,数据库系统引入了事务的概念。事务是一组数据库操作命令的集合,这些命令要么全部执行,要么全部回滚,以保证数据的一致性和完整性。事务是并发控制的最小单元,适用于多用户同时操作的数据库系统场景。在事务中,通常会使用锁机制、多版本并发控制、undo/redo日志等技术来实现事务的ACID属性,即原子性、一致性、隔离性和持久性。事务的引入极大地提高了数据库系统的可靠性和安全性,成为了现代数据库系统不可或缺的重要特性。

    

二、事务的作用

  1.事务的作用

    1. 保证数据的一致性和完整性。通过将一组操作看作一个不可分割的整体来执行,事务可以确保数据的一致性和完整性,避免了数据不一致的问题。

    2. 支持并发操作。在多用户并发访问数据库的情况下,事务可以有效地避免数据冲突和竞争条件,提高系统的并发性能和可靠性。

    3. 支持数据恢复和回滚。在事务执行过程中,如果发生错误或者异常情况,可以通过回滚操作恢复到事务执行前的状态,从而避免了数据丢失和损坏的风险。

    4. 提高系统的可靠性和安全性。事务的引入极大地提高了数据库系统的可靠性和安全性,成为了现代数据库系统不可或缺的重要特性。

 

三、事务的特点  

  1.事务的特点

  事务是数据库管理系统中的一个重要概念,具有以下几个特点:

  1. 原子性(Atomicity):事务是一个不可分割的工作逻辑单元,其所有操作要么全部执行,要么全部不执行。如果其中任何一个操作失败,整个事务都会回滚,回到事务开始前的状态。

  2. 一致性(Consistency):事务执行后,数据库的状态必须是合法的,即符合事务的约束条件和完整性规则。如果事务执行后数据库状态不合法,则事务必须被回滚。

  3. 隔离性(Isolation):并发执行的多个事务之间应该相互隔离,彼此不应该干扰。每个事务应该感知不到其他事务的存在,并且在事务执行期间对其他事务的操作应该是不可见的。

  4. 持久性(Durability):事务执行后,其结果应该是永久性的,即不受系统崩溃、故障或其他异常情况的影响。数据库系统应该通过日志或其他机制来确保事务的持久性。

综上所述,事务具有原子性、一致性、隔离性和持久性这四个特点,通常被称为ACID属性。这些特点保证了数据库操作的正确性和一致性,使得多个用户可以同时对数据库进行访问和操作,提高了系统的可靠性和并发性能。

    

四、事务的应用

    1.事务的应用

事务是数据库管理系统中的一个重要概念,主要用于处理操作量大、复杂度高的数据。以下是事务在数据库应用中的一些常见应用:

  1. 银行系统:银行系统中的转账操作通常需要使用事务来保证数据的一致性和完整性。如果一个用户在转账之前查询余额,然后另一个用户在这之后向该账户汇款,那么第一个用户转账时就会出现余额不足的情况。

  2. 电子商务系统:电子商务系统中的订单管理通常需要使用事务来确保订单信息的正确性和一致性。如果多个用户同时下单,可能会出现订单重复或者信息不一致的情况。

  3. 航空订票系统:航空订票系统中的座位预订通常需要使用事务来保证数据的一致性和完整性。如果多个用户同时预订同一张座位,可能会出现座位重复或者信息不一致的情况。

  4. 物流管理系统:物流管理系统中的订单处理通常需要使用事务来确保订单信息的正确性和一致性。如果多个用户同时下单或者修改订单,可能会出现订单重复或者信息不一致的情况。

  5. 社交网络系统:社交网络系统中的用户信息管理通常需要使用事务来保证数据的一致性和完整性。如果多个用户同时修改同一个用户的信息,可能会出现信息不一致或者数据损坏的情况。

综上所述,事务在数据库应用中具有非常重要的作用,可以保证数据一致性和完整性,避免了数据冲突和竞争条件,提高了系统的并发性能和可靠性。

 

五、事务的管理

  1.事务的影响

在数据库系统中,多个事务之间的相互影响是一个非常重要的问题。由于多个事务可能同时访问和修改同一个数据,因此需要考虑这些事务之间的相互影响,以确保数据的一致性和完整性。以下是一些常见的事务之间的相互影响:

  1. 脏读(Dirty Read):一个事务读取了另一个事务尚未提交的数据,如果此时另一个事务发生回滚操作,则读取的数据将是无效的。这种情况会导致数据不一致和信息泄漏等问题。

  2. 不可重复读(Non-repeatable Read):一个事务在执行过程中多次读取同一个数据,但是读取到的数据不一致。这是因为在读取期间,另一个事务修改了同一条数据,导致数据发生了改变。

  3. 幻读(Phantom Read):一个事务在执行过程中读取了一批数据,但是在之后的操作中发现有新插入的数据,导致读取的数据不完整。这种情况与不可重复读的情况类似,但是出现的原因不同。

  4. 丢失更新(Lost Update):多个事务同时修改同一条数据,但是最后只有一个事务的修改被保留下来,其他事务的修改被覆盖掉了。这种情况会导致数据不完整和信息丢失等问题。

为了避免这些问题,需要使用事务管理技术来控制事务之间的相互影响。通常可以使用锁机制、MVCC、隔离级别、乐观并发控制和悲观并发控制等技术来避免脏读、不可重复读、幻读和丢失更新等问题。但是需要注意的是,不同的技术会对性能和并发性产生不同的影响,需要根据实际情况进行选择和调整。

  2.Mysql及事务隔离级别 

MySQL是一种流行的关系型数据库管理系统,支持事务和多种隔离级别。以下是MySQL中常见的事务隔离级别:

 

  1. 读未提交(Read Uncommitted):在此隔离级别下,一个事务可以读取另一个事务尚未提交的数据。这种隔离级别最不严格,可能导致脏读、不可重复读和幻读等问题。

  2. 读已提交(Read Committed):在此隔离级别下,一个事务只能读取已经提交的数据。这种隔离级别可以避免脏读,但是可能会导致不可重复读和幻读等问题。

  3. 可重复读(Repeatable Read):在此隔离级别下,一个事务在执行过程中多次读取同一条数据,读取到的数据始终相同,即使在事务执行期间有其他事务对数据进行了修改。这种隔离级别可以避免脏读和不可重复读,但是可能会导致幻读等问题。

  4. 串行化(Serializable):在此隔离级别下,所有事务串行执行,每个事务只能访问其他事务已经提交的数据。这种隔离级别最严格,可以避免脏读、不可重复读和幻读等问题,但是会导致性能下降。

 

MySQL默认的隔离级别是可重复读,可以通过设置SESSION或全局变量来修改隔离级别。在选择隔离级别时,需要考虑到数据完整性、并发性能和系统的可用性等因素,选择合适的隔离级别来平衡这些因素。

 

  mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。

  3.事务隔离级别的作用范围    

     全局级:对所有的会话有效
     会话级:只对当前的会话有效

     (1)查询全局事务隔离级别

        show global variables like '%isolation%';

       SELECT @@global.tx_isolation; 

     (2)查询会话事务隔离级别

        show session variables like '%isolation%';   

       SELECT @@session.tx_isolation; 

     SELECT @@tx_isolation;

    (3)设置全局事务隔离级别

      set global transaction isolation level read committed;

     (4)设置会话事务隔离级别

      set session transaction isolation level read committed;

   4.事务控制语句   

    BEGIN 或 START TRANSACTION:显式地开启一个事务。

    COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。

    ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

    SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。

    ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

    (1)提交事务

        开始事务

         修改数据

       提交事务

     (2)回滚事务

      开始事务

       修改数据

        查看修改成功

       回滚

       回滚成功  

    (3)多点回滚

      开始事务

       修改数据

       查看数据

     设置还原点S1

     再次修改数据

     修改成功  

     设置S2还原点

     回到S1还原点

     还原成功

   5.使用 set 设置控制事务

      (1)查看Mysql中的AUTOCOMMIT值

        SET AUTOCOMMIT=0; #禁止自动提交

        SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1

  

   总结:

    如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
    如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
    当然无论开启与否,begin; commit|rollback; 都是独立的事务。

六、总结

    mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。事务是数据库管理系统中的一个重要概念,用于处理操作量大、复杂度高的数据。事务具有ACID特性,即原子性、一致性、隔离性和持久性。原子性指事务是不可分割的,要么全部执行,要么全部回滚;一致性指事务执行前后数据库状态必须保持一致;隔离性指多个事务并发执行时,彼此之间不会产生影响;持久性指一旦事务提交,其修改的数据将会永久保存到数据库中。事务管理包括事务的开始和结束、锁机制、多版本并发控制、日志机制、保存点和分布式事务管理等技术。事务之间可能会产生脏读、不可重复读、幻读和丢失更新等问题,需要使用合适的隔离级别来避免这些问题。

posted @ 2023-07-16 17:10  纸签  阅读(20)  评论(0编辑  收藏  举报