• 详解MariaDB数据库的事务


    1.什么是事务

    数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,一组事务中的SQL语句要不全部执行成功功;如果其中某一条执行失败,则这组SQL语句中已经执行的语句会回滚到这组SQL语句执行之前的状态。

    事务处理,可以确保非事务性单元的多个操作都能成功完成,否则不会更新数据资源。

    数据库默认事务是自动提交的, 也就是发一条 sql 它就执行一条。如果想多条 sql 放在一个事务中执行,则需要使用事务进行处理。

    当我们开启一个事务,并且没有提交,可以使用 rollback 命令手动回滚事务。

    优点:

    通过将一组操作组成一个事务执行时,要么全部成功,要么全部失败的单元。
    使程序更可靠,简化错误恢复。
    

    例如,A用户给B用户转账1000元,此时表现在SQL语句上,就是先更新A账户在的余额,减去1000,然后再更新B账户的余额,加上1000。以上操作对应数据库为两个update操作,这两个操作属于一个事物。否则,万一当数据库在减去A账户上的钱,而还没来得及在B账户加上1000时,数据库出现故障,此时就会出现这1000元钱消失的悲剧,这时数据库的事务就派上用场了。

    2. 事务四大特性

    事务是必须满足4个条件(ACID):

    2.1 原子性(Autmic)

    事务在执行时,要做到“要么不做,要么全做!”,就是说不允许事务只执行其中一部分。
    即使因为故障而使事务不能完成,在rollback时也要消除对数据库的影响。
    

    2.2 一致性(Consistency)

    事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    在事务开始之前和结束之后,数据库的完整性约束没有被破坏
    

    2.3 隔离性(Isolation)

    一个事务的执行不能被其他事务干扰。
    即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。
    

    2.4 持久性(Durability)

    指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
    接下来的其他操作或故障(比如说宕机等)不应该对其有任何影响。
    

    事务的ACID特性可以确保银行不会弄丢你的钱。而在应用逻辑中,要实现这点非常难,甚至可以说是不可能完成的任务。

    3. MySQL事务的使用方法

    3.1 用BEGIN,ROLLBACK,COMMIT来实现

    START TRANSACTION | BEGIN [WORK]  开启事务
    COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 提交当前事务,执行永久操作。
    ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 回滚当前事务到开始点,取消上一次开始点后的所有操作。
    SAVEPOINT 名称 折返点
    

    3.2 直接用 SET AUTOCOMMIT 来改变mysql的自动提交模式

    MySQL/MariaDB数据库默认是自动提交的,也就是你提交一组SQL语句,数据库就会立即执行。
    此时可以使用`SET AUTOCOMMIT`命令来设置事务是否自动提交。
    SET AUTOCOMMIT默认是自动提交的。
    

    SET AUTOCOMMIT命令语法:

    SET AUTOCOMMIT = {0 | 1}
    

    SET AUTOCOMMIT命令的值的设定解析

    0:禁止自动提交
    1:开启自动提交。
    

    需要注意的是,MySQL/MariaDB中只有INNODB和BDB类型的数据表才能支持事务处理!另外一种常用的数据库引擎MyISAM是不支持事务操作的。

    例子:

    MariaDB [book]> set autocommit = 0;				# 设置数据库关闭自动提交
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [book]> delimiter //					# 修改SQL语句的结束符为'//'
    MariaDB [book]> start transaction;					# 定义一组事务操作语句
        -> update books set bName="ccc" where bId=1;	# 把bId等于1的books表的记录的bName改为'ccc'
        -> update books set bName="ddd" where bId=2;	# 把bId等于2的books表的记录的bName改为'ddd'
        -> commit;//
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [book]> delimiter ;						# 把sql语句的结束标志重新改回';'
    MariaDB [book]> select bName from books where bId=1 or bId=2;	# 查找books表中bId等于1或2的所有记录的bName字段信息
    +-------+
    | bName |
    +-------+
    | ccc   |
    | ddd   |
    +-------+
    2 rows in set (0.00 sec)
    
    MariaDB [book]> show create table booksG		# 查看books表的创建信息,可以看出books表使用MyISAM数据引擎,MyISAM引擎不支持事务操作,所以要到books表的引擎改为InnoDB
    *************************** 1. row ***************************
           Table: books
    Create Table: CREATE TABLE `books` (
      `bId` int(4) NOT NULL AUTO_INCREMENT,
      `bName` varchar(255) DEFAULT NULL,
      `bTypeId` enum('1','2','3','4','5','6','7','8','9','10') DEFAULT NULL,
      `publishing` varchar(255) DEFAULT NULL,
      `price` int(4) DEFAULT NULL,
      `pubDate` date DEFAULT NULL,
      `author` varchar(30) DEFAULT NULL,
      `ISBN` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`bId`),
      FULLTEXT KEY `index_bName` (`publishing`)
    ) ENGINE=MyISAM AUTO_INCREMENT=45 DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    MariaDB [book]> alter table category engine=innodb;		# 修改category数据表的引擎为InnoDB
    Query OK, 9 rows affected (0.03 sec)               
    Records: 9  Duplicates: 0  Warnings: 0
    
    MariaDB [book]> alter table books engine=innodb;		# 修改books数据表的引擎为InnoDB
    Query OK, 39 rows affected (0.02 sec)              
    Records: 39  Duplicates: 0  Warnings: 0
    
    MariaDB [book]> show create table books;				# 查看books数据表的创建信息,可以看到books表已经使用InnoDB引擎了
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                               |
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | books | CREATE TABLE `books` (
      `bId` int(4) NOT NULL AUTO_INCREMENT,
      `bName` varchar(255) DEFAULT NULL,
      `bTypeId` enum('1','2','3','4','5','6','7','8','9','10') DEFAULT NULL,
      `publishing` varchar(255) DEFAULT NULL,
      `price` int(4) DEFAULT NULL,
      `pubDate` date DEFAULT NULL,
      `author` varchar(30) DEFAULT NULL,
      `ISBN` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`bId`)
    ) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 |
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.03 sec)
    
    MariaDB [book]> show create table category;				# 查看category数据表,category数据表也已经使用InnoDB引擎了
    +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table    | Create Table                                                                                                                                                                                                                    |
    +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | category | CREATE TABLE `category` (
      `bTypeId` int(4) NOT NULL AUTO_INCREMENT,
      `bTypeName` varchar(40) DEFAULT NULL,
      PRIMARY KEY (`bTypeId`),
      KEY `bTypeName` (`bTypeName`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 |
    +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    MariaDB [book]> set autocommit = 0;						# 设置数据表不自动提交
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [book]> delimiter //							# 把sql语句的结束符更改为'//'
    MariaDB [book]> start transaction;						# 定义一组事务操作语句
        -> update books set bName="book1" where bId=1;		# 把books数据表中bId为1的记录的bName字段改为'book1'
        -> update books set bName="book2" where bId=2;		# 把books数据表中bId为2的记录的bName字段改为'book2'
        -> commit//											# 使用commit提交更改,此时整个事务操作已经完成,不能回滚到update之前的状态了
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    Query OK, 0 rows affected (0.03 sec)
    
    MariaDB [book]> delimiter ;								# 把sql语句的结束符改回';'
    MariaDB [book]> select bName from books where bId=1 or bId=2;		# 查询books数据表中bId为1或2的记录的bName字段信息
    +-------+
    | bName |
    +-------+
    | book1 |
    | book2 |
    +-------+
    2 rows in set (0.00 sec)
    
    MariaDB [book]> delimiter //					# 把sql语句的结束符更改为'//'
    MariaDB [book]> start transaction;				# 定义一组事务操作语句
        -> update books set bName = "name1";		# 把books数据库中所有bName字段更新为'name1'
        -> //
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 39 rows affected (0.01 sec)
    Rows matched: 39  Changed: 39  Warnings: 0
    
    MariaDB [book]> select bName from books;		# 查看books数据表中所有记录的bName字段信息
        -> //
    +-------+
    | bName |
    +-------+
    | name1 |
    | name1 |
    | name1 |
    | name1 |
    | name1 |
    | name1 |
    | name1 |
    +-------+
    39 rows in set (0.01 sec)
    	
    MariaDB [book]> rollback//						# 使用rollback进行回滚操作,由于在前面设置了不自动提交,所以可以回滚成功
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [book]> select bName from books//		# 查询books数据表中所有记录的bName字段信息
    +---------------------------------------------------------+
    | bName                                                   |
    +---------------------------------------------------------+
    | book1                                                   |
    | book2                                                   |
    | 网络程序与设计-asp                                     |
    | pagemaker 7.0短期培训教程                               |
    | 黑客攻击防范秘笈                                        |
    | Dreamweaver 4入门与提高                                 |
    | 网页样式设计-CSS                                       |
    | Internet操作技术                                        |
    | Dreamweaver 4网页制作                                   |
    | Auto CAD职业技能培训教程                                |
    | Fireworks 4网页图形制作                                 |
    | 自己动手建立企业局域网                                  |
    | 页面特效精彩实例制作                                    |
    | 平面设计制作整合案例详解-页面设计卷                    |
    | Illustrator 10完全手册                                  |
    | FreeHand 10基础教程                                     |
    | 网站设计全程教程                                        |
    | 动态页面技术-HTML 4.0使用详解                          |
    | Auto CAD 3D模型大师                                     |
    | Linux傻瓜书                                             |
    | 网页界面设计艺术教程                                    |
    | Flash MX 标准教程                                       |
    | Auto CAD 2000 应用及实例基集锦                          |
    | MySQL                                                   |
    | ASP数据库系统开发实例导航                               |
    | Delphi 5程序设计与控件参考                              |
    | 活学活用Delphi5                                         |
    | Auto CAD 2002 中文版实用教程                            |
    | 精通Javascript                                          |
    | 深入Flash 5教程                                         |
    | Auto CAD R14 中文版实用教程                             |
    | Frontpage 2000& ASP 网页设计技巧与网站维护             |
    | HTML设计实务                                            |
    | Javascript与Jscript从入门到精通                         |
    | lllustrator 9宝典                                       |
    | MySQL                                                   |
    | MySQL                                                   |
    | ASP 3初级教程                                           |
    | XML 完全探索                                            |
    +---------------------------------------------------------+
    39 rows in set (0.00 sec)
  • 相关阅读:
    Java中间件:淘宝网系统高性能利器(转)
    淘宝的数据库拆分(TDDL)(转)
    java web几种开发模式(转)
    C++模板【转】
    set[c++]
    C# jsonhelper
    Vector[C++]
    list[C++]
    map[C++]
    C[泊车管理系统]
  • 原文地址:https://www.cnblogs.com/renpingsheng/p/9610983.html
Copyright © 2020-2023  润新知