mysql实现事务

    xiaoxiao2025-05-25  9

    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;

    转载请注明原文地址: https://ju.6miu.com/read-1299244.html
    最新回复(0)