iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >浅谈数据库--事务(mysql)
  • 464
分享到

浅谈数据库--事务(mysql)

2024-04-02 19:04:59 464人浏览 泡泡鱼
摘要

事务  事务其实是一组对数据库增删改操作的组合,可以这样来理解,当你往某个人身上打1000元的时候,在数据库中会发生两个改变,一个是你的钱减少了,另一个是那个人的钱增加了,这两个操作必须同时满足,

事务


  事务其实是一组对数据库增删改操作的组合,可以这样来理解,当你往某个人身上打1000元的时候,在数据库中会发生两个改变,一个是你的钱减少了,另一个是那个人的钱增加了,这两个操作必须同时满足,不然问题就大了,怎样保证两个操作全部执行,这就需要mysql事务的支持。


mysql是支持事务的,但首先确认你是InnoDB存储引擎

浅谈数据库--事务(mysql)


Mysql事务是为了维护数据库的完整性,堆成批量的语句要么全部执行,要么全部不执行。一般用来管理insert delete 和update语句的。


事务的特点:

1、事务的原子性:一组事务,要么成功;要么撤回。

2、稳定性 : 有非法数据(外键约束之类),事务撤回。

3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。


下面是在mysql中操作的一些命令;

set autoaction=0;//这条命令用来取消mysql的自动提交。
begin;//事务开始。
savepoint pointname;//设立存储点,设立多个可以使用rollback返回到某一个上。
rollback pointname;//返回到某个point。
rollback;//不使用point则返回到begin。
commit;//如果可以提交则用commit提交。

使用 show variables like 'autocommit';可以查看当前autoaction的状态


下面是我在mysql下执行的测试

浅谈数据库--事务(mysql)

浅谈数据库--事务(mysql)

可以看出使用rollback后退回到了添加之前的数据。


使用savepoint的方式,读者可以下去测试。



下面是C语言下对事务的测试:(使用connect c包)


首先测试前表中的数据时这样的

浅谈数据库--事务(mysql)


我的测试代码如下:


这里的my_sql.h只给出了关于事务这部分的代码(关于数据库的所有操作的代码会在后面的手动搭建
Http服务器的博客中给出)。
my_sql.h   
 13     }
 14     bool httpsql::mysql_start()
 15     {
 16         if(mysql_query(mysql,"SET autocommit=0")==0)
 17         {
 18             cout<<"start success"<<endl;
 19             return true;
 20         }
 21         else {
 22             return false;
 23         }
 24 
 25     }
 26     bool HttpSql::mysql_begin()
 27     {
 28         if(mysql_query(mysql,"BEGIN")==0)
 29         {
 30             cout<<"begin success"<<endl;
 31             return true;
 32         }
 33         else{
 34             return false;
 35         }
 36     }
 37     bool HttpSql::mysql_commit()
 38     {
 39         if(mysql_query(mysql,"COMMIT")==0)
 40         {
 41             cout<<"commit success"<<endl;
 42             return true;
 43         }
 44         else{
 40         {
 41             cout<<"commit success"<<endl;
 42             return true;
 43         }
 44         else{
 45             return false;
 46         }
 47     }
 48     bool HttpSql::mysql_rollback()
 49     {
 50         if(mysql_query(mysql,"ROLLBACK")==0)
 51         {
 52             cout<<"rollback success"<<endl;
 53             return true;
 54         }
 55         else
 56         {
 57             return false;
 58         }
 59     }
121     bool HttpSql::mysql_modify(string str)
122     {
123         bool ret=false;
124         string _str="update test_info set ";
125     //  cout<<str<<endl;
126         _str+=str.c_str();
127     //  cout<<_str<<endl;
128         ret=mysql_op(_str);
129         if(ret)
130         {
131             return 1;
132         }else{
133             return -1;
134         }  
135      }                                                                                                                              46,3-9        28%                                                                                                                                           32,2-8         8%


modify.cpp

#include"my_sql.h"

104 int main()
105 {
106     HttpSql sql;
107     if(!sql.mysql_start())
108     {
109         return -1;
110     }
111     char buf1[1024];
112     char buf2[1024];
113     memset(buf1,'\0',sizeof(buf1));
114     memset(buf2,'\0',sizeof(buf2));
115     strcpy(buf1,"update test_info set name=\"wangmazi\" where name=\"zhangsan\"");
116     strcpy(buf2,"update test_info set name=\"wangmazi\" where name\"lisi\"");
            //上面这行代码我故意在where name后面少了一个等于号
117     string str1(buf1);
118     string str2(buf2);
119     if(!sql.mysql_begin())
120     {
121         return -1;
122     }
123     int ret1=sql.mysql_op(str1);
124     int ret2=sql.mysql_op(str2);//因为str2一定会执行失败索引返回false.
125     //ret1=false;
126     if(ret1&&ret2)
127     {
128         if(sql.mysql_commit())
129         {
130             cout<<"modify success"<<endl;
131         }
132         else{
133             cout<<"modify failure"<<endl;
134         }
135     }else    //执行else语句使其退回修改之前的样子。
136     {
137         if(sql.mysql_rollback())
138         {
139             cout<<"modify failure roolback success"<<endl;
140         }
141         else{
142             cout<<"boom!!!1"<<endl;
143         }
144     }
145 
146 
147 }
                                                                                                                                                                                                                                                                                       131,2-8      底端                                                                                                                                           116,2-5       89%

测试结果

浅谈数据库--事务(mysql)

显然表中没有发生改变。


更改代码将上面的'='加上结果如下

浅谈数据库--事务(mysql)


在使用各种语言对事务进行操作的时候要在最后手动关闭连接 mysql_close();




你以为上面的就正确了吗?确实是正确的,因为上面的都是已经配置好的。


在没有弄好之前,花了测试了好久,才发现一个大坑!!听我慢慢道来:


查阅了相关资料,基本上都是在用show engines;查看是否支持innodb存储引擎,但是测试之后却发现根本rollback不了,在代码中显示的是success,但数据库中却是1 worning; 虽然show engines显示的 innodb是yes,但你仍需要添加这段代码:

alter table test_info type=INNODB;不然你有可能永远都测试成功不了



总结:事务对数据库的完整性具有很深的意义。是不可或缺的一部分。关于事务的使用还有很多方面。需要慢慢学习


您可能感兴趣的文档:

--结束END--

本文标题: 浅谈数据库--事务(mysql)

本文链接: https://www.lsjlt.com/news/43045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈数据库--事务(mysql)
    事务  事务其实是一组对数据库增删改操作的组合,可以这样来理解,当你往某个人身上打1000元的时候,在数据库中会发生两个改变,一个是你的钱减少了,另一个是那个人的钱增加了,这两个操作必须同时满足,...
    99+
    2022-10-18
  • 浅谈PostgreSQL数据库
    近期工作重点一直放在数据库设计方面,借助这次机会抽时间整理了一些我对PostgreSQL数据库的理解,同时也是对近段时间学习的一个总结。对于很多人而言或许没有听说过这个数据库,通常我们耳边伴随的都是Orac...
    99+
    2022-10-18
  • 浅谈数据库约束
    国有国法 家有家规其实很多时候技术和生活息息相关,怎样的需求就会有出来解决方案数据库也是那么一个神奇的东西,毕竟是关系型数据库,数据独立而又可以表表关联,有时候就需要约束,在某些时候要规规矩矩做人做事,才能...
    99+
    2022-10-18
  • 浅谈一下mysql数据库底层原理
    1.数据库事务的基本特性。 原子性: 事务中的所有操作要么全部提交成功,要么全部失败回滚。 场景:UPDATE cs_user SET age = 18 , gender = '女' WHER&#...
    99+
    2023-04-20
    mysql数据库 mysql底层原理
  • 浅谈MySQL函数
    目录1、数学函数2、字符串函数3、日期函数4、加密函数 主要MySQL函数介绍又以下: 数学函数 字符串函数 时间函数 加密函数 ...
    99+
    2022-11-12
  • MySQL数据库入门——浅析 视图和事务
    ==========视图============数据库中的虚拟表,相当于软链接作用:一张表中的数据给不同的权限用户提供访问假设一张表:公司员工绩效工资考核表工号    ...
    99+
    2022-10-18
  • 浅谈Oracle数据库的对象
    Oracle数据库---对象中最基本的是表和视图,其他还有约束、索引、序列、函数、存储过程、甚至创建同义词。对数据库的操作可以基本归结为对数据对象的操作,因此,在上篇博文讲述了基本操作的基础上,本篇博文将介...
    99+
    2022-10-18
  • 浅谈android中数据库的拷贝
    SQLiteDatabase不支持直接从assets读取文件,所以要提前拷贝数据库。在读取数据库时,先在项目中建立assets文件夹用于存放外部文件,将数据库文件拷到该目录下。...
    99+
    2022-06-06
    数据 拷贝 数据库 Android
  • 【①MySQL】浅谈数据库系统:MySQL的简介与安装配置
    前言 欢迎来到小K的MySQL专栏,本节将为大家带来MySQL的简介与安装配置的详细讲解~ 目录 前言一、数据库系统概述数据(Data)数据库(Database)数据库管理系统(Data...
    99+
    2023-09-17
    数据库 mysql java
  • 浅谈怎样在UNIX系统下安装MySQL数据库(转)
    浅谈怎样在UNIX系统下安装MySQL数据库(转)[@more@] CODE:...
    99+
    2022-10-18
  • 浅谈NodeJs之数据库异常处理
    本文介绍了NodeJs之数据库异常处理,分享给大家,具体如下: NodeJs版本:4.4.4 数据库链接错误 使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处...
    99+
    2022-06-04
    浅谈 异常 数据库
  • 浅谈三种数据库的 SQL 注入
    目录SQL 注入原理SQL 注入分类1. 数字型注入2. 字符型注入3. 其他类型常见数据库的注入SQL ServermysqloracleSQL 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程...
    99+
    2022-08-11
    SQL 注入
  • 怎么浅谈数据库优化方案
    今天就跟大家聊聊有关怎么浅谈数据库优化方案,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。下面给大家分析了数据库优化方案,具体内容如下1. 利用表分区...
    99+
    2022-10-19
  • 浅谈MYSQL中数据类型和操作数据表
    小编这次要给大家分享的是浅谈MYSQL中数据类型和操作数据表,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。数据类型和操作数据表1.1 MySQL类型之整型1.2 My...
    99+
    2022-10-18
  • 浅谈MySQL 亿级数据分页的优化
    目录背景分析数据模拟1、创建两个表:员工表和部门表2、创建两个函数:生成随机字符串和随机编号3、编写存储过程,模拟500W的员工数据4、编写存储过程,模拟120的部门数据5、建立关键字段的索引,这边是跑完数据之后再建...
    99+
    2022-05-27
    MySQL 亿级数据分页 MySQL 分页优化
  • 浅谈MySQL数据查询太多会OOM吗
    目录全表扫描对server层的影响全表扫描对InnoDB的影响InnoDB内存管理小结我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就...
    99+
    2022-05-16
    MySQL数据查询OOM MySQL OOM
  • MySQL数据类型之浅谈字符串(string)
    目录字符类型(CHAR Types)可变字符类型(Varchar Types)二进制类型(BINARY Types)可变二进制类型(VARBINARY Types)二进制大对象类型(BLOB Types)文本类型(Tex...
    99+
    2022-10-01
  • 浅谈Mysql连接数据库时host和user的匹配规则
    --连接数据库时,host和user的匹配规则 官方文档:https://dev.mysql.com/doc/refman/5.7/en/connection-access.html --host和user的匹配规则...
    99+
    2022-05-22
    Mysql host user 匹配规则
  • 【DB究谈】浅谈对数据库隔离级别的理解
    当人们提及数据库管理系统(DBMS),必会提及事务、ACID特性以及事务隔离级别。事务本身是为了保证系统的运行状态最终将处于一致性(满足一组约束条件)的状态而出现的概念,其中的ACID特性中的I(Isolation)要保证在并发操作情况下数...
    99+
    2021-06-20
    【DB究谈】浅谈对数据库隔离级别的理解
  • 浅谈Golang数据竞态
    目录一个数据竞态的case检查数据竞态解决方案1、WaitGroup等待2、Channel阻塞等待3、Channel通道4、互斥锁典型数据竞态1、循环计数上的竞态2、意外共享变量3、...
    99+
    2023-02-08
    Golang数据竞态
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作