xml地图|网站地图|网站标签 [设为首页] [加入收藏]
事务锁下的并发处理,没有数据自动补0
分类:数据库

with cte as
(
select belongsAgent from [QPProxyDB].[dbo].[BS_ProxyInfo] where ProxyID = @ProxyID 
union all
select a.ProxyID from [QPProxyDB].[dbo].[BS_ProxyInfo] a join cte b on a.ProxyID = b.belongsAgent
)
select * from cte order by belongsAgent asc

一个简单的显示事务    也可以是隐式事务

问题描述

查询数据库表中最近7天的记录

select count(*),date(create_time) as date from task where datediff(now(),create_time)<=6  group by day(create_time); 

 

但是发现某一天没有数据,结果中没有显示当天(2017-08-28)的数据

图片 1

ProxyID 父级

belongsAgent 子集

原子性(Atomicity)**: 事务是一个原子工作单元,事务中的所有修改要么提交,要么撤销。在事务提交指令记录到事务日志之前 如果系统出现了故障,重新启动时,SQL Server 会撤销所做的修改。  如果事务中出现错误 默认会自动回滚   也可以通过 @@TRANCOUNT 检测事务事务完成 或者说是 当前环境是否在事务中 如果在就返回 1 没有就是0 

解决思路

  1. 思路一: 可以在自己的程序中做额外的补零处理

  2. 思路二: 构建一个最近七天的结果集,然后和查询的结果集合做left join(本文采用第二种方式)

select a.click_date,b.count
from (
    SELECT curdate() as click_date
    union all
    SELECT date_sub(curdate(), interval 1 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 2 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 3 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 4 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 5 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 6 day) as click_date
) a left join (
  select date(create_time) as datetime, count(*) as count
  from arms_task
  group by date(create_time)
) b on a.click_date = b.datetime;

当天2017-08-28结果显示为NULL

图片 2

需要把NULL设置为0,利用ifnull函数即可

select a.click_date,ifnull(b.count,0) as count
from (
    SELECT curdate() as click_date
    union all
    SELECT date_sub(curdate(), interval 1 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 2 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 3 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 4 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 5 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 6 day) as click_date
) a left join (
  select date(create_time) as datetime, count(*) as count
  from arms_task
  group by date(create_time)
) b on a.click_date = b.datetime;

 

图片 3

 

例如:一个事务持有行上锁,而另一个事务在该行所在的页或者表请求不兼容锁比如排他锁 有第一个事务的行上锁 有一个 表意向锁  这个时候请求就被拒绝了

锁请求流程规则是什么呢?

SET IMPLICIT_TRANSACTIONS ON

那么锁都可以锁些什么资源呢?

GO
 INSERT INTO Sales.Orders
      (custid, empid, orderdate, requireddate, shippeddate, 
       shipperid, freight, shipname, shipaddress, shipcity,
       shippostalcode, shipcountry)
    VALUES
      (85, 5, '20090212', '20090301', '20090216',
       3, 32.38, N'Ship to 85-B', N'6789 rue de l''Abbaye', N'Reims',
       N'10345', N'France');
GO
SELECT    @@TRANCOUNT

 

排他锁:如果一个事务在修改行,直到事务完成,其他事务都不能修改相同的行。但是能不能读取相同行 取决于它的隔离级别。

在sql  servce 中 事务是一个工作单元 可能包含查询和修改数据以及修改数据定义等多个活动 也可以显示或隐式定义事务边界

显示定义事务 BEGIN TRAN 开始  如果要提交事务 使用 COMMIT TRAN   撤销事务(回滚) ROLLBACK TRAN  如下示例

共享锁:在读取事务加锁是默认加的是共享锁  SQL读取的默认隔离级别 READ COMMITTED  因为此隔离级别 会让事务请求读取资源时默认加上共享锁  多个事务可以同时拥有相同数据资源共享锁。 此模式下也会因为并发造成幻读 虽然在修改数据时,无法修改锁和持续时间,但可以通过改变隔离级别 在读取数据时控制锁定的处理方式。

锁是事务保护数据资源而获得的控制资源,防止其他事务的冲突或不兼容访问。

但意向锁不会拒绝更低级别对象的锁请求  

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:事务锁下的并发处理,没有数据自动补0

上一篇:mysql连接工具与MyISAM表压缩工具,常见的错误及解 下一篇:没有了
猜你喜欢
热门排行
精彩图文