事物是把一些sql语句作为一个原子性操作,就是说我会写好几条sql语句,然后我想把这好几条的sql语句作为一个整体,然后让这个整体一起去运行,不可以拆分开,就像我们用面粉做一个馒头一样,我需要把这些面粉凝聚起来作为一个整体而不是散乱的个体,要是能做成馒头那这些面粉就实验成功了,若不然就失败了,成为试验品,废品,我们的sql语句就要达到这样的效果,那么馒头是面粉通过一定比例的水胶合而成的,我们的sql语句需要使用一个类似于做馒头的水这种中间介质来把它们胶合到一起作为一个整体,那么这个中间介质就是我们所说的---------------------事物.这就是事物的功能以及概念

这些sql语句通过事物这种东西已经胶合到一起成为了一个不可分割的整体了,所以如果可以顺利运行那么就一起运行,否则任何一条有问题都不会运行成功.

所以它一定会有它自己本身的格式,

首先是创建一个事物:

create transaction;

这里接着写sql语句

update count set money=money-800 where id=1;

update count set money=money+300 where id=2;

接下来就是提交事物

commit;

如果不成功就需要使用到回滚功能:

rollback;

create table user(
id int primary key auto_increment,
name char(),
balance int
); insert into user(name,balance)
values
('wsb',),
('egon',),
('ysb',); #原子操作
start transaction;
update user set balance= where name='wsb'; #买支付100元
update user set balance= where name='egon'; #中介拿走10元
update user set balance= where name='ysb'; #卖家拿到90元
commit; #出现异常,回滚到初始状态
start transaction;
update user set balance= where name='wsb'; #买支付100元
update user set balance= where name='egon'; #中介拿走10元
uppdate user set balance= where name='ysb'; #卖家拿到90元,出现异常没有拿到
rollback;
commit;
mysql> select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
| | wsb | |
| | egon | |
| | ysb | |
+----+------+---------+
rows in set (0.00 sec)

这里我们还需要引用一个概念来更加准确完善的理解事物,那就是空间的问题,我们的事物创建之后会先放在缓存区里面,理论上在mycql中我们每次执行运行操作就会产生一个事物,只要在mycql语句中我们每次运行一个带有分号的句子,系统就会觉得我们已经写完了一个完整的sql语句,然后就会创建一个事物.

在事物中如果你不执行提交commit操作的话你创建的事物就留在了缓存区,缓存区有一个特点就是数据不会永久保存的,你关闭了程序后它会被系统清空的,我们创建了事物后需要提交事物,如果提交过程中出现一部分sql语句可以顺利执行但是有一部分无法顺利执行,那么顺利执行的就会被放入缓存区,由于是一个整体,只有部分执行成功后是无法进行提交操作的,所以我们只能用到回滚功能来回收掉它,以减轻缓存空间的压力.

事物有4个特性:

 1 、原子性  (事物内的操作,要么全部成功,要么全部失败)
    事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

  2 、一致性 (事物之前之后,前后数据的一致性)
    事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态 如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

  3 、隔离性(多个事物时,相互不能干扰) 
一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。(如果事物在执行过程中有并发的事物也在执行同一段sql语句,也就是同样的源文件,那么就会卡主,先执行的事物没有执行完,后面也要执行同一源文件的事物就会被卡主,等在原地,一直到先执行的事物提交或者回滚之后,它才会去执行,这个概念有点类似与网络编程里面的gil锁,有人占着它就需要等到别人把它释放掉之后,其他人才可以去抢到它然后执行自己的程序)

4 、持续性(一旦事物提交(commit)之后,是不可回滚的)

也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。 (一旦提交后就把结果从缓存区拿出来了放到了硬盘里面,也就是跟缓存区对应的物理区,硬盘存储有一个很大的特点就是数据会永久性存储)

我们这里还需要引用一个锁的功能和概念进来,

我们的数据库访问的时候是支持并发的,同时可以很多人一同访问它,那么同时访问的时候就有问题了,比如A想要查询这个数据,然后B想要删除这个数据,那么就会有故障,这就冲突了,为了解决掉这个冲突,我们需要一个锁来解决这个冲突,让一切的访问顺序化,这样就可以避免出现类似的情况了.

在实用过程中如果多个用户同时访问一个数据然后都是实用的查询的功能,那么就不会产生任何的冲突,只有在修改和删除的时候才会有冲突存在,我们为了更大限度的提高工作效率以及实现并发性能,有两个锁来解决这个问题,悲观锁锁,乐观锁,

3.开发中常见的两种锁:

  3.1悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block(阻塞)直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制.

  3.2 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

2.1 共享锁(Shared Lock,也叫S锁)

    共享锁(S)表示对数据进行读操作。因此多个事务可以同时为一个对象加共享锁。(如果试衣间的门还没被锁上,顾客都能够同时进去参观)

2.2 排他锁(Exclusive Lock,也叫X)

       排他锁也叫写锁。

    排他锁表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。(某个顾客把试衣间从里面反锁了,其他顾客想要使用这个试衣间,就只有等待锁从里面给打开了)

两种锁各有优缺点:不可认为一种好于另一种,像乐观锁适用于写入比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry(重试),这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适.

我们使用锁的时候,也是有固定格式的,先来乐观锁的固定格式

-- 乐观锁的概念

需要先建立一个表格,

这里需要在表格里面设立一个字段,version,并且给他设立一个默认为0的约束如下sql语句

-- alter table count add version int default 0

这里就开始要使用到乐观锁了:

select * from count where id=2;

在对表格进行修改操作的时候必须要先查询,这是先决条件,
update count set money=money-30,
version=version+1 where id=2 and version=1;  --- 这里我们对查询得到的结果进行修改的时候的固定格式,要基于version这个条件来进行修改,因为每次查询的时候version都会有变化,所以每次修改的时候都需要手动改变这里的version的值,这样会麻烦一点但是它省去了锁的开销,加大了整个系统的吞吐量(翻译过来就是数据库不断的被进行查询操作的时候不断的进行自我检索数据,然后不断的输出查询结果的这个过程)效率更高.

再来就是悲观锁的固定格式:

-- start transaction;
-- select * from count where id=2 for update ;
-- update count set money=2000-200 where id=1;
-- commit;

这就是悲观锁的用法格式,跟事物无异.因为事物里面有一个锁的概念,为了避免冲突的存在,它本身就会让多用户同一时间访问同一源文件的数据时有顺序进行,这就是悲观锁的实现.

day42 事物,数据库锁的更多相关文章

  1. MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

    浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视 ...

  2. day41 python【事物 】【数据库锁】

    MySQL[五] [事物 ][数据库锁]   1.数据库事物 1. 什么是事务  事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性 ...

  3. MySQL 事物和数据库锁

    1.数据库事物 1. 什么是事务  事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一 ...

  4. python【事物 】【数据库锁】

    1.数据库事物 1. 什么是事务  事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一 ...

  5. mysql第五篇 : MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

    第五篇 : MySQL 之 视图.触发器.存储过程.函数.事物与数据库锁 一.视图 视图是一个虚拟表(非真实存在的),其本质是‘根据SQL语句获取动态的数据集,并为其命名‘ ,用户使用时只需使用“名称 ...

  6. ABAP锁、数据库锁

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. Sqlite事物与锁

    1事务 事务定义了一组SQL命令的边界,这组命令或者作为一个整体被全部执行,或者都不执行.事务的典型实例是转帐. 2事务的范围 事务由3个命令控制:BEGIN.COMMIT和ROLLBACK.BEGI ...

  8. 一例胜千言,详谈SQL Sever数据库锁

    1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一 ...

  9. 【Sqlserver系列】【转载】事物与锁

    1   概述 本篇文章简要对事物与锁的分析比较详细,因此就转载了. 2   具体内容 并发可以定义为多个进程同时访问或修改共享数据的能力.处于活动状态而互不干涉的并发用户进程的数量越多,数据库系统的并 ...

随机推荐

  1. vue v-time指令封装(接口返回时间戳 在到日期转换)

    // 全局时间戳转换指令注册Vue.directive('time',{ bind: function (el,binding) { let getTime = new Date(binding.va ...

  2. poj1564 Sum It Up dfs水题

    题目描述: Description Given a specified total t and a list of n integers, find all distinct sums using n ...

  3. nginx官方模块之http_sub_module

    作用 http内容替换 语法 示例 html代码与结果如下:

  4. AD9361寄存器配置顺序,循环模式,自收自发

    :] cmd_data; :] index; begin case(index) 'h000,8'h00};//set spi -- 'h3df,8'h01};//set init -- 'h037, ...

  5. Practical Web Penettation Testing (the first one Mutillidae 大黄蜂 之二)

    1.how  to use dpkg cmmand first it can be used for list all software , dpkg -l  (由于kali linux 没有启动所以 ...

  6. Linux基础一:Linux的安装及相关配置

    1. 计算机操作系统简介    1) 操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间.    2) 操作系统的内核的定义:操作系统的内核是一 ...

  7. 配置webpack loader vue 报错:Module build failed: TypeError: this._init is not a function

    单文件组件 引入时报错 配置webpage.config.js中的vue 需要如下写法 { test: /\.vue/, loader: "vue-loader", } 之前写的l ...

  8. 支持向量机-SMO算法简化版

    SMO:序列最小优化 SMO算法:将大优化问题分解为多个小优化问题来求解 SMO算法的目标是求出一系列的alpha和b,一旦求出这些alpha,就很容易计算出权重向量w,并得到分隔超平面 工作原理:每 ...

  9. 纯css3实现的switch开关按钮

    效果如图 <p> <label><input class="mui-switch mui-switch-anim" type="checkb ...

  10. 微信小程序如何自动弹出提示微信授权?

    我想在一进入页面的时候就进行判断提示并且弹出提示授权!请问该如何处理比较合理 wx.authorize({}) //可以通过 wx.getSetting 先查询一下用户是否授权了 "scop ...