宏观上看,事务就是一次完整的操作过程;程序角度看,事务是用户自定义的数据操作系统,由多条命令组成,内部所有命令语句要被当成一个整体,要么全部被执行,要么全部不执行(前面已经执行部分的命令都撤销—回滚)。以前的后触发器的机制就是事务。
如:a账号要给B账号转N元钱,由两步完成:
(1)A账户号-n;(2)B账号+n
事务对待:上两步要么两句都成功,要么一句都不执行。
(1)原子性:指事务是数据的逻辑工作单位,每一步都要被执行,不可再分。
(2)一致性:指事务的执行结果必须从数据库一个状态确定变到另一个状态。(对数据的改变是确切的,事务常用于数据修改类的操作)
(3)隔离性:在执行一个事务的过程,不能被其它事务干扰。(即使多个事务要使用到共同的数据,那也要依次进行,不交叉并发处理)
(4)持久性:事务一旦被提交运行,它的操作对数据库的改变影响是永远的(事务一旦完成后,不可能回滚)
不需要人为指定和设置,操作过程当事务对待。SQL本身提供的这些数据操纵语句自动当成事务对待的。如:
Update 学生表 set 性别=’男’,身高=身高+0.5 where 姓名=’杨春’
详细过程:在表中定位到杨春记录—复制数据到deleted临时表—再删除本记录—再复制到inserted临时表—再修改inserted临时表的数据性别,身高—再把inserted数据存放到物理表
程序员写代码时,明确显示地写出事务的开始和结束标记。 一般事务是定义在过程中的,有可能把整个过程的代码当成事务,也可以把过程的部分连续位置的代码当成事务。 明尾暗头—事务的开头是隐含的,但结束有明确标记(常用于整个过程的开头号到当前代码为事务)。
四大事务专用语句
(1)begin transaction: 事务开始
(2)commit transaction: 事务到此已经成功执行,数据已经处理完成,后继语句可不当事务对待。
(3)rollback transaction: 整数处理过程出错了,回滚到没有处理之前的数据状态,或回滚到事务内部的保存点。
(4)save transaction: 事务内部的保存点,如果事务内有此语句,当事务回滚时,可以不全部回滚,只回滚到本位置
例1:模拟上面银行转账
Begin tran
Update 支付表 set 总额=总额-n where 账号=’a’
Update 支付表 set 总额=总额+n where 账号=’b’
Commit tran
说明:最简单的事务。最前面的begin tran可省—明尾暗头
例:学生表的年龄约束为10-100;身高介于1-3.0米
begin tran
update 学生表 set 年龄=20 where 姓名='杨春'
update 学生表 set 身高=-1 where 名字=