sql事务实例

下面是一个简单的事务的实例。是单位就餐补助查询用的,主要是根据就餐的记录判断餐别,对不同的人增加补助,就是一个运算而已

CREATE PROCEDURE [dbo].[AddBZmoney] AS---确定就餐类型和补助金额
begin
begin tran

insert into SumBZ(卡号,日期,餐别,就餐金额)--汇总每日就餐明细

SELECT Detail.卡号, Detail.就餐日期, dbo.GetBZType(Detail.就餐时间) AS 餐别, --查询就餐金额
      SUM(Detail.消费金额) AS 消费金额
FROM Detail INNER JOIN
      BZType ON dbo.GetBZType(Detail.就餐时间) = BZType.餐别
WHERE (Detail.状态 = 0)
GROUP BY Detail.就餐日期, dbo.GetBZType(Detail.就餐时间), Detail.卡号

update Detail set 状态=1 where 状态=0--更新补助状态

create table TempBZ--建立中间表,确定补助的金额
(
ID int,
BZmoney money
)

insert into TempBZ
SELECT SumBZ.ID,
CASE
 WHEN SumBZ.就餐金额 >= BZType.补助标准 and People.加班补助=1 and SumBZ.餐别='晚餐'THEN BZType.补助标准--晚餐有加班补助的,超过4元补4元
 when SumBZ.就餐金额 >= BZType.补助标准 and People.加班补助=0 and SumBZ.餐别='晚餐'then 0--晚餐无加班补助的,补0元
 when SumBZ.就餐金额 >= BZType.补助标准 and SumBZ.餐别='午餐' then BZType.补助标准--午餐全部超过3元的,补3元
 when  SumBZ.餐别='早餐' then BZType.补助标准--早餐不补
 WHEN SumBZ.就餐金额 < BZType.补助标准 THEN 0--未超过补助额度的不补
end
FROM SumBZ INNER JOIN
      BZType ON SumBZ.餐别 = BZType.餐别 inner join People On People.卡号=SumBZ.卡号

declare @i int
set @i=(select min(ID) from TempBZ)
while @i<=(select max(ID) from TempBZ)
begin
update SumBZ set 补助金额=(select BZmoney from TempBZ where ID=@i) where ID=@i
set @i=@i+1
end
drop table TempBZ
if (@@error!=0)
begin
rollback tran
return(1)
end
commit tran
end
GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Java多线程事务的示例: ``` public class TransactionThread extends Thread { private Connection conn; private String sql; public TransactionThread(Connection conn, String sql) { this.conn = conn; this.sql = sql; } public void run() { try { // 关闭自动提交,开启事务 conn.setAutoCommit(false); // 执行SQL语句 Statement stmt = conn.createStatement(); stmt.executeUpdate(sql); // 提交事务 conn.commit(); // 关闭连接 stmt.close(); conn.close(); } catch (SQLException e) { try { // 出现异常,回滚事务 conn.rollback(); // 关闭连接 conn.close(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } } public static void main(String[] args) { // 获取数据库连接池 DataSource dataSource = getDataSource(); // 创建多个线程进行事务操作 TransactionThread thread1 = new TransactionThread(dataSource.getConnection(), "INSERT INTO table1 (col1, col2) VALUES ('value1', 'value2')"); TransactionThread thread2 = new TransactionThread(dataSource.getConnection(), "UPDATE table2 SET col1='value1' WHERE col2='value2'"); thread1.start(); thread2.start(); } } ``` 该示例中,我们创建了一个TransactionThread类,用来执行一个SQL语句,并在多线程环境下进行事务管理。在run方法中,我们首先关闭自动提交,开启事务;然后执行SQL语句;如果执行过程中出现异常,我们回滚事务;否则提交事务。在main方法中,我们创建了两个TransactionThread对象,分别执行不同的SQL语句,以模拟多线程环境下的事务操作。需要注意的是,在实际应用中,我们应该使用专业的事务管理框架,如Spring的声明式事务管理,来进行事务操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值