SQL中什么是事务
- 事务的概念:
事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。事务就是一些SQL语句组(每条单独的SQL语句也算一个事务),其中事务中的SQL语句一个执行失败,其余全部回滚。
- 事务的特点:
原子性:事务中的SQL语句的操作都是一个整体,是不可分割的,并不会只执行其中一句,保证事务中的所有操作都执行完毕,其中事务里一个SQL语句出错,整个事务全部回滚,回滚到之前操作的原始状态
一致性:如果事务成功执行,在同一个时间点的所有事务读取的信息一致。
隔离性:每个事务都互不影响,保证不同的事务相互独立、透明地执行。
持久性:当事务执行完毕时,它对数据的影响会保存到数据库中,即使出现系统故障,之前成功执行的事务的结果也会持久存在。
- 事务的意义:
事务的存在保证了数据的完整性,事务中对数据的更改不会因为一个SQL语句错误而更改其他相应数据,当多个应用程序在高并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰
- 事务的示例
创建一个数据库
--创建名字为 INDEXK 的数据库
create database INDEXK
go
use INDEXK
go
创建一个数据表
--创建一个用户信息表
create table INFO
(
ID int primary key identity, --主键
Name varchar(20) not null, --姓名
Value int not null check(Value<110 and Value>0) --金额
)
用户表中,我们添加约束金额数量不得大于110元,(以便体现后面出事务的重要性)
向表中添加数据
--添加相应数据(张三,李四)
insert into INFO values('张三',100),('李四',90)
问题:李四想转账给张三10元,(李四Values-10,张三Values+10)
我们可以看出,这时李四的金额扣10元,张三的金额加10元就可以了。
如果我们不用事务,正常的SQL语句就是这样;
--修改相应数据
update INFO
set Value = 110
where Name = '张三'
update INFO
set Value = 80
where Name = '李四'
可是如果在执行语句出错时,或者在运行SQL语句时出现各种错误(这里错误是约束报错:超出约束值),那么数据会怎么样变化呢?
我们可以看出当上一个语句报错时,第二个语句继续执行,可是这样就违背了我们数据的完整性,所以,我们在处理SQL语句时,我们常常套用事务来一起处理,我们一起来看看事务的作用
事务使用
事务语句:
begin transaction 事务名
SQL语句
if @@ERROR!=0 --@@ERROR 如果前一个T-SQL语句没有出现错误,则返回0.
rollback transaction --回滚(撤销事务)
else
commit transaction 事务名 --提交事务
//语句解析
begin transaction --意思为开启一个事务
@@ERROR --是为一个错误代码,当SQL语句发生错误时,函数会被附上值,
rollback transaction --回滚(撤销事务)
commit transaction --提交事务
--开启一个名为t1_INFO的事务
begin transaction t1_INFO
update INFO
set Value = 80
where Name = '李四'
update INFO
set Value=110
where Name = '张三'
if @@ERROR!=0 --@@ERROR 如果前一个T-SQL语句没有出现错误,则返回0.
rollback transaction --回滚(撤销事务)
else
commit transaction t1_student --提交事务
我们在去执行这个事务时
我们发现,数据并没有被修改,事务中SQL修改数据发生错误,不过哪一个出现错误,整个事务的SQL语句都不会被执行(全部回滚),这样就保证了数据的完整性
问题:张三想转账给李四10元,(张三Values-10,李四Values+10)
如果转账的人反过来呢(约束值并未超过)
--开启一个名为t1_INFO
begin transaction t1_INFO
update INFO
set Value=90
where Name = '张三'
update INFO
set Value = 100
where Name = '李四'
if @@ERROR!=0 --@@ERROR 如果前一个T-SQL语句没有出现错误,则返回0.
rollback transaction --回滚(撤销事务)
else
commit transaction t1_student --提交事务
可以看出SQL语句都能正常执行这样保证了数据的一致性
好了,SQL事务就讲到这里了,欢迎大家留言评论