美文网首页
mysql事务是什么?

mysql事务是什么?

作者: 黄刚刚 | 来源:发表于2021-03-30 15:36 被阅读0次

    1.事务是什么?

    事务是一组SQL组成的一个执行单元,一个执行单元内的SQL要么全执行要么全不执行。

    其实mysql中有个可配置参数“autocommit”自动提交,默认是“ON”开启状态,这其实就是配置的事务自动提交。我们从手动初始化一个事务到提交或者回滚事务,这是一个完整的事务周期。当我们未手动初始化事务而对数据库进行操作时,mysql默认对每一个操作作为一个独立的事务,并且执行完成后自动提交,这种情况也是一个完整的事务周期。

    事务有四个特性:原子性、一致性、隔离性、持久性;

    原子性:事务是一个最小执行单元,一个执行单元内的SQL要么全执行要么全不执行。

    隔离性:每个事务中的所有操作都被相互隔离,不受其他事务中操作的影响。

    持久性:binlog日志让数据库的所有操作都具有持久性,并且理论上可以根据binlog恢复到任意时间节点的任一操作执行完成后的结果。每一步的操作都被持久性的记录了下来,并且可以用来进行数据记录的回退和恢复,这不就是持久性吗?

    一致性:一致性放在最后面讲,是因为事务的一致性本就是由原子性、隔离性、持久性说带来的,如果其他3个特性其一不满足时,也就谈不上一致性了。

    2.事务隔离级别是什么?有哪些隔离级别?每种隔离级别分别会出现什么现象?

    SQL标准定义了4种事务隔离级别,MySql全都支持。分别为:

    1.读未提交(READ UNCOMMITTED):可以读到别的事务中修改并未提交的数据,这种数据有可能会被回滚,所以属于“脏数据”

    2.读提交(READ COMMITTED):解决了“读未提交”的读脏数据问题,但是还有“幻读”的问题,比如同一个事务中,我们读取主键ID为1的记录的“余额”字段,这会儿读出来是0,然后其他的事务提交了对这条数据的修改,再读“余额”字段就变成1了,在同一个事务中,不同的时刻查询出来的数据可能不一致,这就是“幻读”,随时读到的数据都有可能不一致。

    3.可重复读(REPEATABLE READ)【MySql默认事务隔离级别】:在一定程度上降低了“读提交”的幻读问题,但是还是没有完全解决“幻读”的问题。可重复读隔离级别是指,事务中不会读到其他事务对已有数据的修改,即使其他事务的修改已经提交,一事务中一开始读到的数据是什么,在事务结束前任意时刻去读都不会改变,但是,这个规则只针对已有数据可重复读,比如我们读ID为1的数据,别的事务中把ID为1的数据删除了,并且重新插入了一条ID为1的数据,那我们的事务中在不同时刻去读ID为1的数据还是存在不一致的情况,所以,没有完全解决“幻读”的问题。

    4.串行化(SERIALIZABLE):顾名思义,就是前一个事务未结束之前,下一个事务是处于等待状态的,形成阻塞的状态,当然这种确实是能解决上面的脏数据,幻读这些问题,但是生产环境中完全不建议使用。

    3.锁是什么,mysql中有哪些锁,有什么用?

    “锁”是计算器协调多个进程或者线程并发访问某一资源的机制,mysql的事务隔离级别其实是依靠“锁”来实现的,mysql的锁机制主要是“共享锁”与“排它锁”。

    比如事务隔离级别读未提交”,它性能最好,因为它根本就不加锁,当然也没有起到什么隔离效果,可以理解为没有隔离;再说“串行化”,读的时候加共享锁,其他事务可以并发读,但是不能进行写操作,写操作加排它锁,其他事务不能并发读也不能并发写,需等锁释放

    再说“锁粒度”,MySQL不同存储引擎都以自己的方式实现了锁机制,锁的粒度大小都不是由我们使用sql时人为指定的,“锁粒度”是在加锁时存储引擎实现的锁机制自行判断能使用的粒度大小的。

    MyISAM和MEMORY存储引擎采用的“锁粒度”是表锁;InnoDB存储引擎则支持行锁了,但是我们某条加锁的sql它最终不一定能使用到行锁的粒度,比如在一条全表扫描查询的sql上加锁,它肯定是表锁毫无疑问。

    参考资料:

    MySQL事务隔离级别和实现原理

    MySQL锁总结

    相关文章

      网友评论

          本文标题:mysql事务是什么?

          本文链接:https://www.haomeiwen.com/subject/ktewhltx.html