能够做二维码网站,成品1688网站,wordpress建站不好用,免费网站建设程序下载什么是事务
事务就是把SQL语句打包成一个整体#xff0c;在这组SQL执行的时候#xff0c;要么同时成功#xff0c;要么同时失败。
事务的ACID特性
事务的ACID特性指的是 Atomicity (原⼦性)#xff0c; Consistency (⼀致性)#xff0c; Isolation (隔离
性)和 Durabi…什么是事务
事务就是把SQL语句打包成一个整体在这组SQL执行的时候要么同时成功要么同时失败。
事务的ACID特性
事务的ACID特性指的是 Atomicity (原⼦性) Consistency (⼀致性) Isolation (隔离
性)和 Durability (持久性)。
Atomicity (原⼦性)
支持事务的数据库最基本的一个特性一组SQL要么全部执行成功要么全部不执行不会出现只执行一半的情况如果执行的过程中出现了错误事务就会回滚到事务开始的状态就像这个事务没有执行过一样。
Consistency (⼀致性)
事务执行完成之后保证正确并且符合预期
Isolation (隔离性)
多个事务之间不能相互的影响。
Durability (持久性)
事务一旦提交都需要保存到存储介质中无论数据库是否破坏都不会影响数据的安全不能丢失
注一致性是通过原子性隔离性和持久性来实现的 数据库服务是一个网络服务可以支持多个客户端进行访问 为什么要使用事务 事务具备的ACID特性是我们使⽤事务的原因在我们⽇常的业务场景中有⼤量的需求要⽤事务来保证。⽀持事务的数据库能够简化我们的编程模型, 不需要我们去考虑各种各样的潜在错误和并发问题在使⽤事务过程中要么提交要么回滚不⽤去考虑⽹络异常服务器宕机等其他因素因此我们经常接触的事务本质上是数据库对 ACID 模型的⼀个实现是为应⽤层服务的。 注在使用数据库的过程中对于修改只要提交成功就可以安全的保存只需要回滚就可以回到事务之初。
如何使用事务
1.查看支持事务的存储引擎
要使⽤事务那么数据库就要⽀持事务在MySQL中⽀持事务的存储引擎是InnoDB可以通过
show engines; 语句查看
查看当前MySQL支持的存储引擎 2.对事务控制的语法
开始一个事务
start transaction 或者 begin;提交当前的事务并对更改持久化保存
commit回滚当前的事务取消修改
rollback注无论提交还是回滚事务都会关闭开启事务之后所写的SQL语句在事务当中这些SQL具有ACID特性 事务回滚之后事务中的所有修改都会回到修改开始之前也就是修改被撤销
select * from account;
start transaction;
insert into account values (3,laoliu,4300);
select * from account;
rollback;
select * from account; 事务提交之后就无法进行回滚了。无论提交还是回滚事务都会关闭
start transaction;
insert into account values (3,laoliu,4300);
commit;
select * from account;
rollback;
select * from account; 保存点
在事务的执行过程中设置保存点可以在回滚的时候回退到保存点的数据不至于回滚到事务开始的时候。 设置保存点
savepoint ‘保存点的名字’ 回滚到指定的保存点
rollback to ‘保存点的名字’
如果要回滚到事务开始的时候
rollback
select * from account;
start transaction ;
insert into account values (null,xiaohe,2500);
savepoint one;
insert into account values (null,xiapzhu,1600);
select * from account;
rollback to one;
select * from account;
rollback;
select * from account; 自动手动的提交事务
默认情况下MySQL是⾃动提交事务的也就是说我们执⾏的每个修改操作⽐如插⼊、更新和删除都会⾃动开启⼀个事务并在语句执⾏完成之后⾃动提交发⽣异常时⾃动回滚。
查看当前事务是否⾃动提交可以使⽤以下语句 show variables like autocommite; 设置事务为自动提交 set autocommit1; set autocommiton; 设置事务为手动提交
set autocommit0;
set autocommitoff; 注
只要使⽤ START TRANSACTION 或 BEGIN 开启事务必须要通过 COMMIT 提交才会持久化与是否设置 SET autocommit ⽆关,或者通过rollback回滚才能结束事务。
⼿动提交模式下不⽤显⽰开启事务执⾏修改操作后提交或回滚事务时直接使⽤ commit
或 rollback 事务是保证数据安全的索引是保证查询的效率的
事务的隔离性和隔离级别
隔离性
MySQL服务可以同时被多个客⼾端访问每个客⼾端执⾏的DML语句以事务为基本单位那么不
同的客⼾端在对同⼀张表中的同⼀条数据进⾏修改的时候就可能出现相互影响的情况为了保证不同 的事务之间在执⾏的过程中不受影响那么事务之间就需要要相互隔离这种特性就是隔离性。
隔离级别
事务间不同程度的隔离称为事务的隔离级别
READ UNCOMMITTED 读未提交
READ COMMITTED 读已提交
REPEATABLE READ 可重复读(默认)
SERIALIZABLE 串⾏化 1.READ UNCOMMITTED读未提交
一组数据事务A对数据进行了修改事务B访问了事务A还没有提交的数据这个情况叫‘脏读’
2.READ COMMITTED 读已提交
事务A第一次查询了某条记录此时事务B对这条记录进行了修改并提交了当事务A再次查询这条的时候发现与第一次的查询结果不一致这个现象叫做“不可重复读” 3.REPEATABLE READ可重复读 事务A第一次查询了某个结果集那么第一次以相同的查询得到的结果集与第一次的不同这个现象叫做”幻读“两次同样的查询得到了不同的结果集。
InnoDB存储引擎中使用了next-key锁锁住了目标行之间的间隙解决了部分的幻读问题。 4.SERIALIZABLE串⾏化
解决了所有的数据安全问题所有事务都是一个挨着一个执行一个事务必须要等到上一个事务执行完才可以执行 不同隔离级别的性能与安全
隔离级别脏读不可重复读幻读READ UNCOMMITTED存在存在存在READ COMMITTED解决存在存在REPEATABLE READ解决解决存在SERIALIZABLE解决 解决 解决 查看和设置隔离级别
全局作用域
SELECT GLOBAL.transaction_isolation; 会话作用域
SELECT SESSION.transaction_isolation; 设置事务的隔离级别和访问模式
# ⽅式⼀
SET GLOBAL transaction_isolation SERIALIZABLE;
# 注意使⽤SET语法时有空格要⽤-代替
SET SESSION transaction_isolation REPEATABLE-READ;
# ⽅式⼆
SET GLOBAL.transaction_isolationSERIALIZABLE;
# 注意使⽤SET语法时有空格要⽤-代替
SET SESSION.transaction_isolationREPEATABLE-READ; 1.READ UNCOMMITTED读未提交 在⼀个客⼾端A中先设置全局事务隔离级别为 READ UNCOMMITTED 读未提交: 打开另⼀个客⼾端B并确认隔离级别 在不同的客⼾端中执⾏事务
先执行对话框A 执行对话框B 对话框A 对话框B 2.READ COMMITTED 读已提交 在⼀个客⼾端A中先设置全局事务隔离级别为 READ COMMITTED 读未提交:
对话框A 对话框B 对话框A 对话框B 3.REPEATABLE READ可重复读 由于 REPEATABLE READ 隔离级别默认使⽤了 Next-Key 锁为了重现幻读问量我们把隔离 级回退到更新时只加了排他锁的 READ COMMITTED . 对话框A 对话框B 对话框A 对话框B 4.SERIALIZABLE串⾏化 进⼀步提升事务的隔离级别到 SERIALIZABLE 此时所有事务串⾏执⾏可以解决所有并发中的安全问题。 希望能对大家有所帮助