网站开发调研问卷,项目管理证书 pmp,自动化的网站建设,营销策划运营培训机构1、事务具有ACID特性原子性(atomicity)#xff1a;一个事务被事务不可分割的最小工作单元#xff0c;要么全部提交#xff0c;要么全部失败回滚。一致性(consistency)#xff1a;数据库总是从一致性状态到另一个一致性状态#xff0c;它只包含成功事务提交的结果隔离型(is…1、事务具有ACID特性原子性(atomicity)一个事务被事务不可分割的最小工作单元要么全部提交要么全部失败回滚。一致性(consistency)数据库总是从一致性状态到另一个一致性状态它只包含成功事务提交的结果隔离型(isolation)事务所做的修改在最终提交一起对其他事务是不可见的持久性(durability)一旦事务提交则其所做的修改就会永久保存到数据库中。2、事务的隔离级别1)隔离级别的定义与问题READ UNCOMMITTED(读未提交)事务的修改即使没有提交对其他事务也都是可见的。事务能够读取未提交的数据这种情况称为脏读。READ COMMITTED(读已提交)事务读取已提交的数据大多数数据库的默认隔离级别。当一个事务在执行过程中数据被另外一个事务修改造成本次事务前后读取的信息不一样这种情况称为不可重复读。PEPEATABLE READ(可重复读)这个级别是MySQL的默认隔离级别它解决了脏读的问题同时也保证了同一个事务多次读取同样的记录是一致的但这个级别还是会出现幻读的情况。幻读是指当一个事务A读取某一个范围的数据时另一个事务B在这个范围插入行A事务再次读取这个范围的数据时会产生幻行。特别说明InnoDB和XtraDB存储引擎通过多版本并发控制(MVCCMultiversion Concurrency Control)解决了幻读问题它使用间隙锁(next-key locking)锁定查询涉及的行和索引中的间隙防止幻影行的插入。SERIALIZABLE(可串行化)这个事务是最高的隔离级别它强制事务串行执行避免了幻读问题。简单来说SERIALIZABLE会在读取的每一行数据上都加锁所以可能会导致大量的超时和锁竞争隔离级别脏读可能性不可重复度可能性幻读可能性加锁读READ UNCONMITEDYesYesYesNoRED COMMITEDNoYesYesNoREPEATABLE READNoNoYesNoSERIALIZABLENoNoNoYes2)如果查看修改和MySQL的隔离级别show variables like tx_isolation; # 查看隔离级别MySQL8以前show variableslike transaction_isolation; # 查看隔离级别MySQL8set global transaction_isolationREAD-COMMITTED; // 设置隔离级别阀域READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE事务的隔离级别可以是Session层的我们可以对不同的Session设置不同级别set session transaction isolation level read uncommitted;set session transaction isolation level read committed;set session transaction isolation level repeatable read;set session transaction isolation level serializable;3)Spring事务隔离级别Spring事务默认使用数据库的隔离级别可以通过注解Transactional中的isolation参数调整Session级的隔离级别。隔离级别是会话级别的JDBC的java.sql.Connection接口支持隔离级别的设置。Spring在开启事务时(DataSourceTransactionManager.doBegin)根据注解配置对Connection的隔离级别进行设置MySQL驱动com.mysql.cj.jdbc.ConnectionImpl执行SQL语句调整会话级的隔离级别3、死锁死锁是指两个或多个事务在同一资源上相互占用并请求锁定对方占用的资源从而导致恶性循环。死锁示例# 事务一starttransaction;update account set money10 where id1;update account set money20 where id2;commit;# 事务二starttransaction;update account set money10 where id2;update account set money20 where id1;commit;假设碰巧事务一和事务二同时执行完第一个update语句接着准备执行第二条update语句却发现记录已被对方锁定然后2个事务都等待对方释放资源同时持有对方需要的锁这样就会出现死循环。为了避免死锁问题数据库实现了各种死锁检测和死锁超长机制InnoDB处理死锁的方式是将持有最少行级排他锁的事务进行回滚。