sql-事务处理

事务的概念:简单说就访问并可能更新数据库中各种数据项的一个程序执行单元,一旦开启事务,所有对数据的操作要么全部执行,要么全部都不执行。单条sql语句本身就是一个事务.

事务的属性

  事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有4个属性,称为原子性(Atomic)、 一致性(Consistent)、隔离性(Isolated)、持久性(Durable),简称ACID属性,只有这样才能构成一个事务。

  原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

  持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

工作开发过程中对事务的依赖性很强,复杂一点的sql操作一般都离不开事务.

举个很简单的例子,银行转账是简单可以分为两个步骤

如:账号A向账号B转1000元钱。

1、账号B+1000元;

2、账号A-1000元;

这两步是不可分的,假如账号B+1000元后,执行第二步发现账号A余额不足时(当然实际开发中会先判断余额,这里是假设),执行失败,那么账号B就多出了1000元,而账号A却没减去1000元。

有了事务我们就可以保证这两步要么全部执行,要么全部不执行。

伪代码:

begin 事务

  update 账号表 set money=money+1000 where 账号=账号B;

  update 账号表 set money=money-1000 where 账号=账号A;

if 程序报错

  rollback 事务;

else

  commit 事务;

--------------------------------------------------------------------------------------------------------------------------------

sql代码

1 create table tbl_test(
2     id nvarchar(10),
3     name nvarchar(5)
4 );
5 insert into tbl_test values(‘001‘,‘名字1‘);
6 update tbl_test set name=‘名字2‘ where id=‘001‘
7 update tbl_test set name=‘名字超过5字‘ where id=‘001‘ --这句话会报错 将截断字符串或二进制数据。

上面的代码最后执行完,会将名字1改为名字2

加上事务

 1 begin transaction
 2 update tbl_test set name=‘名字2‘ where id=‘001‘;
 3 update tbl_test set name=‘名字超过5字‘ where id=‘001‘;
 4 if @@error <> 0
 5     begin
 6         rollback transaction
 7     end
 8 else
 9     begin
10         commit transaction
11     end

执行结果name字段的值还是名字1,第二句update执行失败了之后,第一句update也没有执行。

另一种写法:T-sql是有异常机制的

 1 begin try
 2     begin transaction
 3         update tbl_test set name=‘名字2‘ where id=‘001‘;
 4         update tbl_test set name=‘名字超过5字‘ where id=‘001‘;
 5         commit transaction
 6 end try
 7 begin catch
 8     --select ERROR_NUMBER() as 错误代码
 9     rollback transaction
10 end catch
时间: 2024-09-30 20:19:01

sql-事务处理的相关文章

SQL语句中事务与try catch使用

普通SQL事务: begin transaction tr declare @error int; set @error=0; select * from Car_Brand set @[email protected][email protected]@ERROR select 1/0 set @[email protected][email protected]@ERROR select * from AREA set @[email protected][email protected]@

Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据库理论,网状,层次, 数据库理论树形数据库注册表,hashtable 数据库理论,kv数据库.hashtable 数据库理论Oodb 数据库理论nosql db 数据库理论隔离级别 数据库理论 数据库理论Er模型 数据库理论Acid数据库完整性 数据库理论关系模型 数据库理论   sql 数据库理论 数据库理论存储过程 数据库理论 触发器 数据库理论 视图 约束 数据库理论 数据

MySQL外键及级联删除 &amp;&amp; 表的存储引擎与创建索引 &amp;&amp; 删除数据库和表

Messages表: mysql>create table Messages( ->message_id int auto_increment primary key, ->user_name varchar(50) not null, ->author_id int not null, ->body text, ->forum_id int not null); Forums表: mysql>create table Forums( ->forum_id

PHP 常用函数总结(二)

4.PHP处理数据库的常用函数. 汇总表 PHP 5 MySQLi 函数 函数 描述 mysqli_affected_rows() 返回前一个 Mysql 操作的受影响行数. mysqli_autocommit() 打开或关闭自动提交数据库修改功能. mysqli_change_user() 更改指定数据库连接的用户. mysqli_character_set_name() 返回数据库连接的默认字符集. mysqli_close() 关闭先前打开的数据库连接. mysqli_commit() 提

mybatis教程1(基本使用)

官方网站 一.什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 二.mybatis和hibernate的比较 mybatis hibernate 半自动ORM框架

数据库概论 实验

查看表结构:DESC STUDENT ; 查看所有表:SELECT * FROM TAB; ORACLE查看所有用户:SELECT * FROM ALL_USERS; 例1-1: (建立数据库表)  建立教学数据库的四个数据库表,其中Student表中不包含SSEX(C,2) 字段,Sname 字段为Sname(C,8)且可为空. 学生情况表: CREATE   TABLE      STUDENT (SNO  CHAR(5)  CONSTRAINT PK_S PRIMARY KEY, SNAM

Oracle EBS-SQL (OM-5):检查订单事务处理类型.sql

SELECT            HO.NAME OU                                                                           名称,           t.NAME                                                                   订单事务处理类型,           t.DESCRIPTION                           

SQL Server事务处理

1 /// <summary> 2 /// SQL Server事务处理 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void btn_Tran_click(object sender, EventArgs e) 7 { 8 //------------

c# + Sql server 事务处理

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性.在sql server+ .net 开发环境下,有两种方法能够完成事务的操作,保持数据库的数据完整性:一个就是用sql存储过程,另一个就是在ADO.NET中一种简单的事务处理:现在通过一个典型的银行转账的例子来说明一下这两个例子的用法我们先来看看sql存储过程是如何来完成事务的

winform插入sql的事务处理

实现目的:点击按钮,原子性执行两条sql语句,同时成功或同时失败 数据库有这三个字段(忽略已有的一条记录): 一.用事务的sql语句 按钮事件完整代码: //事务处理插入sql语句 using (SQLiteConnection con = new SQLiteConnection("Data Source=xxx.db3;Pooling=true;FailIfMissing=false;Password=123456")) { using (SQLiteCommand cmd = n