青岛做外贸网站哪家好,中国价格网,云南建站,长垣做网站事务 注意#xff1a;一定要使用 Innodb 存储引擎 概述#xff1a;一组操作的集合#xff0c;是不可分割的工作单元#xff0c;会把一个部分当成一个整体来处理#xff0c;事务会把操作同时提交或者是撤销。要么同时成功#xff0c;要么同时失败。 比如#xff1a;上云…事务 注意一定要使用 Innodb 存储引擎 概述一组操作的集合是不可分割的工作单元会把一个部分当成一个整体来处理事务会把操作同时提交或者是撤销。要么同时成功要么同时失败。 比如上云转账1000元给张三第一上云账户少1000第二张三账户多一千。
事务操作 数据准备 drop table if exists account;
#创建账户信息表
create table account( id int primary key AUTO_INCREMENT comment ID,name varchar(10) comment 姓名, money double(10,2) comment 余额
) comment 账户表; insert into account(name, money) VALUES (上云,4000), (张三,4000);未控制事务演示 正常转账的情况下 #正常转账的情况下
select * from account;#减少上云账户上的1000元
update account set money money -1000 where name 上云;
#增加张三账户上的1000元
update account set money money 1000 where name 张三;异常转账的情况下 select * from account;update account set money 4000;update account set money money -1000 where name 上云; 出错了update account set money money 1000 where name 张三;控制事务方式1 查看事务提交方式 SELECT autocommit1:自动提交
0:手动提交设置事务提交方式 set autocommit0;#设置成手动提交提交事务 commit;回滚事务 rollback;控制事务方式2 开启事务 start transaction 或者 begin;提交事务 commit;回滚事务 rollback;事务的作用对象
只能回滚 insert、delete 和 update 语句不能回滚 select回滚 select 没有任何意义对于 create、drop、alter 这些无法回滚.
事务的四大特征ACID
原子性Atomicity整个事务中的所有操作必须作为一个单元全部完成或全部取消不可分割要么全部成功要么全部失败一致性Consistency事务完成时数据保持一致状态隔离性Isolation数据库会提供隔离机制并发不会相互影响和干扰一个事务不会影响其他事务的运行持久性(Durability)在事务完成以后该事务对数据库所作的更改将持久地保存在数据库之中并不会被回滚。
并发事务的问题面试经常问
脏读一个事务读到另外一个事务还没有提交的数据 事务B读取到事务A还没有提交的数据 不可重复读一个事务先后读取同一条记录但两次读取的数据不同称之为不可重复读。 事务A两次读取同一条数据但是读取到的数据不一样 幻读一个事务按照条件查询数据时没有对应的数据行但是在插入数据时又发现这行数据已经存在好像出现了 “幻影”。
事务的隔离级别 注意隔离级别越高数据越安全但是性能低。需要在性能和安全之间进行取舍。 查看隔离级别 SELECT TRANSACTION_ISOLATION;设置隔离级别 SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }隔离级别分为全局的和会话级的 全局的对所有会话有效global会话级的只对当前的会话有效session
演示 脏读(read uncommitted 未提交读) 会话1会话2use transaction;use transaction;set global transaction isolation level read uncommitted;start transaction;start transaction;insert into account values(2,‘sy’,100);select * from account;rollback;select * from account; read committed(已提交读) 会话1会话2set global transaction isolation level read committed;start transaction;start transaction;insert into account values(2,‘sy’,100);select * from account;select * from account;(不能查询出数据)commit;select * from account;(查询出数据) repeatable read(可重复读) 会话1会话2set global transaction isolation level repeatable read;start transaction;start transaction;insert into account values(3,‘xxxxy’,100);select * from account(读不出来)commit;select * from account(能读出来)