锁表和mc_mer_trad_incom的更新频率有关系的
可以在mc_payment_flow,mc_payment_flow表上建索引减少mc_mer_trad_incom的锁表时间
如果有频繁的mc_payment_flow,mc_payment_flow表的更新 *** 作可以直接使用X锁避免NS锁的升级
可以在select中加入with rs use and keep exclusive locks避免锁升级
数据库的参数可调整locktimeout,locklist,maxlocks
每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避免死锁等问题,文章以DB2(版本9)与为例进行讲解。
什么是数据库锁定与死锁
锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性;在设计与数据库交互的程序时,必须处理锁与资源不可用的情况。锁定是个比较复杂的概念,仔细说起来可能又需要一大篇,所以在本文中,只把锁定看作是一个临时事件,这意味着如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。
如何避免锁
我们可利用事务型数据库中的隔离级别机制来避免锁的创建,正确地使用隔离级别可使程序处理更多的并发事件(如允许多个用户访问数据),还能预防像丢失修改(LostUpdate)、读“脏”数据(DirtyRead)、不可重复读(NonrepeatableRead)及“虚”(Phantom)等问题。
隔离级别问题现象
丢失修改读“脏”数据不可重复读“虚”
可重复读取NoNoNoNo
读取稳定性NoNoNoYes
光标稳定性NoNoYesYes
未提交的读NoYesYesYes
表1:DB2的隔离级别与其对应的问题现象
在只读模式中,就可以防止锁定发生,而不用那些未提交只读隔离级别的含糊语句。昌平电脑培训发现一条SQL语句当使用了下列命令之一时,就应该考虑只读模式了
DB2数据库用户的验证是依靠 *** 作系统用户的,所以只要你修改了 *** 作系统上的用户密码,自然就修改了DB2用户的密码,如:
$db2 connect to <dbname> user user1
user1必须是存在于数据库服务器 *** 作系统上的用户,验证密码也是该 *** 作系统上的用户密码
重置mysql主从同步(MySQL Reset Master-Slave Replication)
在mysql主从同步的过程中,可能会因为各种原因出现主库与从库不同步的情况,网上虽然有一些解决办法,但是有时很难彻底解决,重置主从服务器也许不是最快的办法,但却是最安全有效的。
下面将自己重置主从同步的步骤总结一下,以备不时之需。
master与slave均使用:centos60+mysql 5161 ,假设有db1,db2两个数据库需要热备。
文中shell与mysql均使用root账号,在真实环境中,请根据情况更换。
1停止slave服务器的主从同步
为了防止主从数据不同步,需要先停止slave上的同步服务。
STOP SLAVE;
2对master服务器的数据库加锁
为了避免在备份的时候对数据库进行更新 *** 作,必须对数据库加锁。
FLUSH TABLES WITH READ LOCK;
如果是web服务器也可以关闭apache或nginx服务,效果也是一样的。
3备份master上的数据
mysqldump -u root -p -databases db1 db2 > baksql
4重置master服务
RESET MASTER;
这个是重置master的核心语法,看一下官方解释。
RESET MASTER removes all binary log files that are listed in the index file, leaving only a single, empty binary log file with a numeric suffix of 000001, whereas the numbering is not reset by PURGE BINARY LOGS
RESET MASTER is not intended to be used while any replication slaves are running The behavior of RESET MASTER when used while slaves are running is undefined (and thus unsupported), whereas PURGE BINARY LOGS may be safely used while replication slaves are running
大概的意思是RESET MASTER将删除所有的二进制日志,创建一个000001的空日志。RESET MASTER并不会影响SLAVE服务器上的工作状态,所以盲目的执行这个命令会导致slave找不到master的binlog,造成同步失败。
但是我们就是要重置同步,所以必须执行它。
5对master服务器的数据库解锁
UNLOCK TABLES;
如果你停止了apache或nginx,请开启它们
6将master上的备份文件拷贝到slave服务器上
大可不必用WinScp先下载到本地再上传到slave上,可以直接使用scp命令在服务器间拷贝,速度更快。
scp -r root@XXXXXXXXXXXX:/root/baksql /
7删除slave服务器上的旧数据
删除前,请先确认该备份的是否都备份了。
DROP DATABASE db1;
DROP DATABASE db2;
8导入数据
SOURCE /root/baksql;
9重置slave服务
RESET SLAVE;
还是看一下官方解释
RESET SLAVE makes the slave forget its replication position in the master's binary log This statement is meant to be used for a clean start: It deletes the masterinfo and relay-loginfo files, all the relay log files, and starts a new relay log file To use RESET SLAVE, the slave replication threads must be stopped (use STOP SLAVE if necessary)
大概意思是,RESET SLAVE将清除slave上的同步位置,删除所有旧的同步日志,使用新的日志重新开始,这正是我们想要的。需要注意的是,必须先停止slave服务(STOP SLAVE),我们已经在第一步停止了它。
10开启slave服务
START SLAVE;
大功告成,SHOW SLAVE STATUS\G 检查同步状态,一切正常。
db get snapshot for database on DBNAME
并查找以下的行
Database files closed =
如果上述参数的值不为 那么增加MAXFILOP的值直到不断打开和关闭文件的状态停埂
db update db cfg for DBNAME using MAXFILOP N
四 锁
LOCKTIMEOUT的缺省值是 这意味着将没有锁超时(对 OLTP 应用程序 这种情况可能会是灾难性的) 尽管如此 我还是经常发现许多 DB 用户用LOCKTIMEOUT= 将LOCKTIMEOUT设置为很短的时间值 例如 或 秒 在锁上等待过长时间会在锁上产生雪崩效应
首先 用以下命令检查LOCKTIMEOUT的值
db get db cfg for DBNAME
并查找包含以下文本的行
Lock timeout (sec) (LOCKTIMEOUT) =
如果值是 考虑使用以下命令将它更改为 秒(一定要首先询问应用程序开发者或您的供应商以确保应用程序能够处理锁超时)
db update db cfg for DBNAME using LOCKTIMEOUT
您同时应该监视锁等待的数量 锁等待时间和正在使用锁列表内存(lock list memory)的量 请发出以下命令
db get snapshot for database on DBNAME 查找以下行 Locks held currently= Lock waits= Time database waited on locks (ms)= Lock list memory in use (Bytes)= Deadlocks detected= Lock escalations=
lishixinzhi/Article/program/DB2/201311/21957
以上就是关于DB2锁方面的SQL语句分析全部的内容,包括:DB2锁方面的SQL语句分析、昌平电脑培训分享在Java程序中处理数据库超时与死锁、怎么修改DB2的数据库用户的密码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)