澳门十大赌场最新排名 > 澳门十大赌场 > 同一行数据在不同索引操作下引起的死锁,0解压

原标题:同一行数据在不同索引操作下引起的死锁,0解压

浏览次数:106 时间:2019-10-09

 

 
摘要:
下文讲述使用round sql函数,对数值型数据进行舍入操作
实验环境:sqlserver 2008

解压版安装操作
官网下载: mysql-installer-community-8.0.12.0.msi
如上操作:
mysqld --install  安装服务
net start mysql  启动服务

 

转自:

解决navicat客户端工具连不上服务的问题

死锁概述


对于数据库中出现的死锁,通俗地解释就是:不同Session(会话)持有一部分资源,并且同时相互排他性地申请对方持有的资源,然后双方都得不到自己想要的资源,从而造成的一种僵持的现象。
当然,在任何一种数据库中,这种僵持的情况不会一直持续下去,因为一直持续下去双方永远都无法执行,没有任何意义,
在SQL Server中,后台线程会以3秒钟一次的频率检测死锁Session,并且选择其中一个回滚代价相对较低的作为牺牲品,从而使解除不同Session相互僵持的现象。
因此SQL Server中死锁的僵持时间不会超过3秒钟。

最近接到用户需求,需对数值型数据,无论后面数据多少,直接进行舍入操作,左思右想,终于发现了round函数可以满足此操作。

round函数舍入特性介绍:
round语法介绍:

通常情况下,最简单也是最常见的死锁是发生在不同表级别的,
Session 1 第一步修改A表,第二步修改B表,
Session 2第一步修改B表,第二步修改A表,
当发生Session 1与Session 2推进顺序发生交叉的时候,死锁就发生了,这种结局办法也比较简单,以相同的推进顺序进行操作即可解除死锁。

round(数据表达式,长度[,操作方式])

参数说明:
数据表达式:
接收一个tinyint、int、bigint、decimal、numeric、money、smallmoney、float、real
长度:
此参数须为tinyint int smallint类型
round函数舍入的精度
操作方式:
此参数须为tinyint int smallint类型

以下演示一种不用于以上情况,稍微特殊一点的死锁。

缺省值:为0,如果输入其它值,则将截断“数据表达式”

返回值说明:
tinyint返回int
int 返回int
bigint 返回bigint
decimal numberic 返回decimal numberic
money smallmoney返回money

 

float real 返回float

<span style="color:red;">
注意事项:
当"长度"为正数时,则将小数点后舍入的位数
当"长度"为负数时,则将小数点前舍入的位数
</span>
 -----------------------------------------------------
round应用举例:

SELECT ROUND(8989.3652, 2), --小数位后保留2位,四舍五入
ROUND(8989.3652, -2),--小数位前舍入2位,四舍五入
---小数位全部舍入,四舍五入
ROUND(8956.34, 0),ROUND(8956.65, 0),ROUND(8956.25, 0), 
---截断数据舍入位置后的数据
ROUND(16081.83,0,-2), ROUND(16081.83,0,1), ROUND(16081.83,0,5),
ROUND(16081.835,2,8), ROUND(16081.836,-2,6), ROUND(16081.83,-2,7)
go

---例:sql取消四舍五入方法分享
---丢失小数位后两位,并不进行四舍五入操作
select round(8989.999,2,9)

 

同一张表上发生的死锁演示

不过死锁的种类有很多种,上述的仅是一种最简单最常见的一种死锁,
理论上,只要满足死锁发生的条件:不同Session(会话)排他性地持有一部分资源,并且相互申请对方持有的资源
都会产生死锁,并不仅仅是在不同的表上,而是在不同的资源上,这种资源,可以是同一张表,甚至同一行数据上,以下举例说明。

--TestDeadLock的Id是主键(默认生成聚集索引),Col2字段是唯一性的非聚集索引
create table TestDeadLock
(
    Id int constraint pk_TestDeadLock_id primary key,
    Col2 int constraint uk_TestDeadLock_col2 unique,
    Remark varchar(100)
)

然后利用SQLQueryStress,开启两个回话,分别按照聚集索引和非聚集索引,删除同一行数据(造测试数据的时候会设置Id和Col2都为1),
如下图所示
一开始先让这两个Session一直执行(空运行),随后往TestDeadLock表中插入一行数据(insert into [TestDeadLock] values (1,1,newid()))
可能需要执行几次尝试,就会观察到其中一个SQLQueryStress中发生了异常信息

图片 1

打开其异常信息的详细内容 ,会发现是死锁

 图片 2

本文由澳门十大赌场最新排名发布于澳门十大赌场,转载请注明出处:同一行数据在不同索引操作下引起的死锁,0解压

关键词: ag电子游戏试玩

上一篇:创建_Log表及触发器,InnoDB锁冲突案例演示

下一篇:没有了