营销型网站 平台,国内最大的开源网站,十大互联网企业排名,移动互联网开发专业的行业人才预测需求报告杂项
InnoDB最大特点#xff1a;支持事务和行锁#xff1b;
MyISAM不支持事务
介绍
一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元#xff0c;只有当事务中的所有操作都正常执行完了#xff0c;整个事务才会被提交给数据库。事务有如下特性…杂项
InnoDB最大特点支持事务和行锁
MyISAM不支持事务
介绍
一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元只有当事务中的所有操作都正常执行完了整个事务才会被提交给数据库。事务有如下特性
1.事务的所有SQL语句全部执行成功才能提交commit事务把结果写回磁盘上。
2.事务执行过程中有的SQL出现错误那么事务必须要回滚rollback到最初的状态。
ACID特性
事务的原子性Atomic事务的一致性Consistency事务的隔离性Isolation
当两个或者多个事务并发执行时为了保证数据的安全性将一个事物内部的操作与其它事务的操作隔离起来不被其它正在执行的事务所看到使得并发执行的各个事务之间不能互相影响。
事务的持久性Durability
事务完成(commit)以后DBMS保证它对数据库中的数据的修改是永久性的即使数据库因为故障出错也应该能够恢复数据 ACD特性是由mysql的undo log和 redo log 保证 I特性是由mysql事务 锁机制保证 mysql中最重要的是日志而不是数据。 事务相关指令
BEGIN; 开启一个事务
COMMIT; 提交一个事务
ROLLBACK; 回滚一个事务到初始的位置
SAVEPOINT point1; 设置一个名字为point1的保存点
ROLLBACK TO point1; 事务回滚到保存点point1而不是回滚到初始状态
SET TX_ISOLATIONREPEATABLE-READ; 设置事务的隔离级别
SELECT TX_ISOLATION; 查询事务的隔离级别
实践例子
查看是否设置了自动提交 事务并发存在的问题
脏读Dirty Read一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时当事务A更新后事务B查询读取到A尚未提交的数据此时事务A回滚则事务B读到的数据就是无效的脏数据。事务B读取了事务A尚未提交的数据不可重复读NonRepeatable Read一个事务的操作导致另一个事务前后两次读取到不同的数据。例如当事务A和事务B并发执行时当事务B查询读取数据后事务A更新操作更改事务B查询到的数据此时事务B再次去读该数据发现前后两次读的数据不一样。事务B读取了事务A已提交的数据虚读Phantom Read幻读一个事务的操作导致另一个事务前后两次查询的结果数据量不同。事务B读取了事务A新增加的数据或者读不到事务A删除的数据
事务的隔离级别
MySQL支持的四种隔离级别是
1、READ-UNCOMMITTED。未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据不可重复读和虚读都是被允许的。
2、READ-COMMITTED。已提交读。说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。
3、REPEATABLE-READ。可重复读。说明事务保证能够再次读取相同的数据而不会失败但虚读仍然会出现。
4、SERIALIZABLE。串行化。是最高的事务级别它防止读脏数据不可重复读和虚读。它相当于加了读写锁某个会话读时其他线程不能写 注解
事务隔离级别越高为避免冲突所花费的性能也就越多降低并发度。
在“可重复读”级别实际上可以解决部分的虚读问题但是不能防止 update 更新产生的虚读问题要禁止幻读产生还是需要设置串行化隔离级别。