xml地图|网站地图|网站标签 [设为首页] [加入收藏]
通过mycat实现mysql的读写分离,取消数值四舍五入
分类:数据库

mysql的主从配置沿用上一篇博客的配置:

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

 

mycat下载地址:

转自:

 

试验版本:Mycat-server-1.6-release 


死锁概述

# cd /usr/local
# mv ~/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz /usr/local
# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
# cd /usr/local/mycat/conf/
# vim server.xml 查看mycat用户的默认配置

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

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

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

<!-- mycat的默认用户配置,保持不变即可 -->
<user name="root">
  <property name="password">123456</property>
  <property name="schemas">TESTDB</property>
</user>

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

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

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

  # vim schema.xml 修改schema配置读写分离

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

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

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

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat=";
  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- 设置物理表 -->
    <table name="student" dataNode="dn1" />
  </schema>
  <!-- 设置物理库 -->
  <dataNode name="dn1" dataHost="localhost1" database="test" />  
    <!-- balance=1设置为读写分离 -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- 读库配置 -->
    <writeHost host="hostM1" url="xxx.xxx.xxx.xxx:3306" user="root" password="xxxxxx">
      <!-- 读库配置,可配置多个读库 -->
      <readHost host="hostS2" url="xxx.xxx.xxx.xxx:3316" user="root" password="xxxxxx" />
    </writeHost>
  </dataHost>
</mycat:schema>

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)

 

 

# cd ../bin
# ./mycat start 启动mycat
# ps -aux | grep mycat 查看mycat是否启动成功

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

在客户端新建一个链接到mycat的数据库连接,用户名密码为server.xml中配置的用户

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

图片 1  

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

连接中库为TESTDB,也是在server.xm中配置的

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

图片 2

图片 3

下面验证读写分离

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

mycat:图片 4

 图片 5

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:通过mycat实现mysql的读写分离,取消数值四舍五入

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文