什么是事务
因为事务的存在,可以使得多条sql语句一起执行,并且只有全部执行成功或全部执行失败俩种结果,保证了数据的安全,也使得这些sql语句拥有了原子性,隔离性,一致性,持久性(ACID)
事务的ACID特性
Atomicity(原子性):一个事务中的所有操作,要嘛全部都执行失败,要嘛全部执行成功这俩中结果,不会存在某些执行成功,某些执行失败的情况,如果执行失败,能确保数据能回滚(RollBack)搞事务执行之前,就好像这个事务没有执行过一样
Consistency(一致性):事务执行开始和结束之后,数据库的完整性不会被破坏,也就是说数据的写入规则完全符合数据库的预期,包括数据的精度,关联性,约束条件,还会有如果数据库崩溃了应该如何恢复
Isolation(隔离性):数据库允许了多个事务同时的对数据进行读取的修改,那么隔离性就确保他们在对数据进行修改或者读取的时候的数据的准确性,不会因为多线程操作而引起线程安全问题,可以设置不同的隔离性来确保在不同场景下数据库的性能和安全性
Durability(持久性):事务在结束之后数据被储存在响应的存储介质中,确保了即使发生故障数据也不会丢失
事务的隔离性和隔离级别
当同一个数据库被多个事务访问,并对同一张表的同同一条数据进行修改,那就不可避免的会出现不同事务相互影响的情况出现,因为这样,那么不同的事务之间就需要相互隔离起来,这就是隔离性
隔离级别
|-----------------|------|
| READ UNCOMMITED | 读未提交 |
| READ COMMITED | 读已提交 |
| REPEATABLE READ | 可重复读 |
| SERIALIZABLE | 序列化 |
表格从上到下对应的数据库的并发性能递减
不同的隔离性存在的问题
在sql中开启一个事务之后,在未进行显示提交之前,所有对数据库的操作都不会直接写入数库中,而是会处于暂存状态,只有在提交了事务之后,才会真正的将数据写入到数据库中
READ UNCOMMITED 读未提交
读未提交在隔离级别中最低的,他允许了事务读取到处于暂存状态的数据,但是这样就会有脏读的错误出现
事务A读到了事务B处于暂存状态的数据,那么如果事务B之后将数据回滚的话,那么事务A就读到了脏数据,这是不存在的数据,这种现象就叫做脏读
那么为了解决脏读的情况,可已使用读已提交隔离
READ COMMITTED 读已提交
读已提交只能读取其他事务提交之后的数据,这样就避免了因为读取到了未提交的数据而引起的脏读,但是这样有会引起一个新的问题,不可重复读
当事务A在数据库中读到了数据C,这之后事务B对数据C进行了修改为D并提交,那么这是事务A再读取数据C,结果发现结果为D了,这样就导致了在同一个事务中俩次相同的读取获得的结果不同,这中现象叫做不可重复读
那么为了解决脏读和不可重复读的问题,可以使用可恶重复读
REPEATABLE READ 可重复读
为了解决不可重复读的问题,可重复读加入了行级锁,可重复锁会给事务使用过的数据按行为单位上锁,这样就不允许别的事务去使用,于是就解决了不可重复读的问题,可是这样也会引起新的问题,幻读
当事务A在对数据使用区域查找到CDE之后,CDE都是被上锁,那么事务B不能修改CDE但是,B可以插入数据F到C之后,那么在B提交之后数据变成了CBDE了,这时事务A又使用相同的查询,结果发现结果为CBDE了,这俩次查询到了数据又不同了,这种现象就叫做幻读
那么为了解决脏读,不可重复读,幻读这些问题,就可以使用最强的隔离方式序列化
SERIALIZABLE 序列化
序列化将所有的事务变为串行执行, 必须等上一个事务限制行玩才能接着执行下一个,没有了并发执行的能力,也就不有并发执行带来的问题,安全性最高
事务的相关sql语句
开启一个事务
start transaction;
提交事务
commit;
查看会话的隔离等级
SELECT @@SESSION.transaction_isolation;
查看全局的隔离等级
SELECT @@GLOBAL.transaction_isolation;
设置会话隔离级别
SET SESSION transaction isolation level serializable(隔离级别);
设置全局隔离级别
SET GLOBAL transaction isolation level serializable;
设置事务的访问模式
设置事务只读
SET GLOBAL transaction isolation level read only;
设置只能读写
SET GLOBAL transaction isolation level read write;
end~~