1、定义:确保数据的完整性,表示封装为一个工作逻辑单元的一系列数据操作语句,一组SQL语句,要么同时成功,要么同时失败。
2、事务的ACID属性:
1)原子性:此属性表明执行了所有数据相关操作或没有执行任何操作。
2)一致性:成功完成事务后,所有数据均处于一致的状态。
3)隔离性:操作对数据所作的所有更改是否对并发事务可见,2个事务间不可见。
4)持久性:完成的事务对数据所作的任何更改在系统中永久有效。
3、事务执行的过程:
4、实现事务代码可参考:
-- 没有事务处理 第一条添加成功 后面两条添加失败
insert into employee(id,name,salary) values(142,'cq',9000);
insert into employee(id,name,salary) values(142,'cq',9000);
insert into employee(id,name,salary) values(142,'cq',9000);
#开启事务,则会同时失败,同时成功
start TRANSACTION;
insert into employee(id,name,salary) values(146,'cq',9000);
insert into employee(id,name,salary) values(101,'cq',9000);
insert into employee(id,name,salary) values(102,'cq',9000);
commit;-- 手动开启的事务必须手动提交,提交事务结果反映到数据库。
其中,mysql默认自动提交事务,可关闭自动提交的事务。
set autocommit=0;#关闭自动提交
#因为关闭了自动提交事务,则添加数据不会保存到数据库中
insert into employee(id,name,salary) values(143,'cq',9000);
commit;#手动提交所有未执行的数据
5、回滚,rollback 还原(事务中若出现错误,则把所有数据恢复到事务开始前的状态),其实现还原,适用savapoint保存点方式参考代码:
-- 保存点 savepoint
begin
declare is_error int default false;#是否出错的标志
declare continue handler for sqlexception
set is_error=true;#声明异常处理程序,如果sql异常,则把标志为设置为true
start TRANSACTION;#开启事务,则会同时失败,同时成功
savepoint s1;#创建保存点
insert into employee(id,name,salary) values(146,'cq',9000);
savepoint s2;
insert into employee(id,name,salary) values(101,'cq',9000);
insert into employee(id,name,salary) values(102,'cq',9000);
if is_error THEN
rollback to savepoint s1;-- 还原到s1
insert into employee(id,name,salary) values(151,'cq',9000);
insert into employee(id,name,salary) values(152,'cq',9000);
commit;
end if;
end;
6、事务的隔离级别确定事务相互隔离的程度。mysql支持以下隔离级别:
1)read-uncommitted:指定事务能查看其他事务所作的尚未提交的数据更改。
2)read-committed:指定数据更改仅在提交后才对其他事务可见。
3)repeatable-read:指定事务中的每次读取都将返回同一组数据,是隔离InnoDB的默认值。
4)serializable:指定事务在所有被访问记录和资源上放置锁。
使用sql代码设置事务隔离级别的方式:
set session transaction isolation level read uncommitted;
7、serializable隔离级别中锁的使用
1)手动锁定表中锁的类型:
a)read锁:共享锁,阻止对资源的任何写入。
b)write锁。
2)锁的用法参考代码:
-- 打开锁
lock table employee read;#给表加上只读锁,只能查询,不能更新
select * from employee;#成功
delete from employee where id=101;#失败
-- 解锁
unlock tables;