设置与查看sql server中锁的超时时间(ZT)

本文介绍数据库中设置锁超时时间的方法来主动处理死锁问题,包括如何查看和设置锁超时时间,以及锁超时机制的工作原理。

在数据库的应用系统中,死锁是不可避免的。通过设置死锁的处理优先级方法,可以在数据库引擎中自动检测到死锁,对发生的死锁会话进行干预,从而达到解除死锁的目点,但在这种情况下,会话只能被动的等待数据库引擎的自我检查。

我们是否可以让会话自身也拥有处理死锁的主动权呢?这就是设置锁的超时时间。当一个会话与另一个会话冲突引阻塞时,如果等待的时间超过指定的值,则该会话自动取消,并释放数据库资源。这样,就达到了解决死锁的目的。

那么如何来查看锁的超时时间呢?利用@@lock_timeout函数即可: 可以看一下@@LOCK_TIMEOUT的语法与定义:

@@LOCK_TIMEOUT--返回当前会话的当前锁超时设置,单位为毫秒。

返回类型--integer

解释说明: SET LOCK_TIMEOUT 允许应用程序设置语句等待阻塞资源的最长时间。当一条语句已等待超过LOCK_TIMEOUT所设置的时间,则被锁住的语句将自动取消,并给应用程序返回一条错误信息。

比如,我们要查看一个会话的超时时间,可以利用以下sql来查看:

select @@LOCK_TIMEOUT

在没有设置过超时时间的情况下,该语句会返回结果-1,代表没有超时时间。

那么又如何设置超时时间呢?可以利用以下sql语句:

set lock_timeout <锁超时时间 >

注意: 1,锁超时时间是以毫秒为单位的。 2,设置的超时时间只对当次会话有效。 可以做一个简单的测试,在microsoft sql server management中打开一个查询窗口,执行

set lock_timeout 2600 select @@lock_timeout

可以看到返回结果为2600毫秒,然后再打开一个新的查询窗口(即一个新的会话),执行

select @@lock_timeout

返回结果为-1,可见前一个会话的设置对当前的会话无效。

如果将锁超时间设置为0,那么在发生资源锁定时,会话将不做任何等待,直接返回1222错误。

使用锁超时的不足之处: 如果我们有设置了锁超时时间,那么当会话等待时间达到超时时间时,就会直接返回1222错误,而且不会回滚或取消当前事务。需要我们在应用程序中截获1222错误,再作相关处理。如果我们在应用程序中未做任何处理,则事务会继续运行,从而导致程序的逻辑错误,因为前面有的语句可能根本没有执行或未执行完整。

import akshare as ak import pandas as pd def fetch_total_fund_data(): """获取涨停板封板资金数据""" zt_pool = ak.stock_zt_pool_em(date=datetime.now().strftime("%Y%m%d")) # 计算当日封板资金总和(亿元) total_fund = zt_pool['封板资金'].sum() / 100000000 # 万元转亿元 return total_fund import sqlite3 import schedule import time from datetime import datetime, timedelta def save_to_db(): """定时保存数据到SQLite数据库""" data = fetch_total_fund_data() conn = sqlite3.connect('total_fund.db') data.to_sql('total_fund_data', conn, if_exists='append', index=False) conn.close() print(f"{pd.Timestamp.now()} - 已保存{len(data)}条记录") # 设置定时任务(每15秒钟执) schedule.every(15).seconds.do(save_to_db) while True: schedule.run_pending() time.sleep(1) import plotly.express as px from dash import Dash, dcc, html, Input, Output import dash_bootstrap_components as dbc # 创建Dash应用 app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) app.layout = html.Div([ dcc.Interval(id='live-update', interval=60*1000), # 每分钟更新 dcc.Graph(id='live-bar-chart'), dcc.Dropdown(id='stock-selector', multi=True, options=[], placeholder="选择对比股票"), dcc.Graph(id='history-chart') ]) @app.callback( [Output('live-bar-chart', 'figure'), Output('stock-selector', 'options')], [Input('live-update', 'n_intervals')] ) def update_live_chart(n): """更新实时封板资金柱状图""" conn = sqlite3.connect('zt_pool.db') df = pd.read_sql("SELECT * FROM zt_pool_data", conn) conn.close() latest = df.groupby('代码').last().reset_index() fig_bar = px.bar( latest.nlargest(10, '封板资金'), x='名称', y='封板资金', title='实时封板资金TOP10', color='封板成功率', color_continuous_scale='RdYlGn' ) options = [{'label': f"{row['名称']}({row['代码']})", 'value': row['代码']} for _, row in latest.iterrows()] return fig_bar, options @app.callback( Output('history-chart', 'figure'), [Input('stock-selector', 'value')] ) def update_history_chart(selected_codes): """更新历史对比折线图""" if not selected_codes: return px.scatter() conn = sqlite3.connect('zt_pool.db') query = f"SELECT * FROM zt_pool_data WHERE 代码 IN ({','.join(['?']*len(selected_codes))})" df = pd.read_sql_query(query, conn, params=selected_codes) conn.close() df['时间'] = pd.to_datetime(df['时间']) # 添加时间戳字段 fig_line = px.line( df, x='时间', y='封板资金', color='名称', title='封板资金历史趋势对比', markers=True, line_shape='spline' ) return fig_line if __name__ == '__main__': app.run_server(debug=True)帮我检查这段代码是否有问题
最新发布
07-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值