数据库的事务隔离级别是什么? 遇到过幻读吗? 如何解决幻读?
数据库的事务隔离级别是数据库系统用来控制事务并发执行时可见数据的一套规则。按照ANSI/ISO SQL标准,事务隔离级别主要有四种:
读未提交(Read Uncommitted):
在这种级别下,事务可以看到其他事务未提交的修改,可能导致脏读(Dirty Reads),即读取了其他事务未提交且最终可能回滚的数据。读已提交(Read Committed):
在这个级别,一个事务只能看到其他事务已经提交的数据,解决了脏读问题,但可能出现不可重复读(Non-repeatable Reads),即在同一事务中多次读取同一数据时,由于其他事务提交的修改,前后读取的结果不一致。可重复读(Repeatable Read):
在这个级别,事务在整个执行过程中看到的数据是一致的,即在同一个事务内多次读取同一数据时结果总是相同的,解决了不可重复读问题。但在这个级别下,如果其他事务插入了新的记录,即使这些记录符合当前事务的查询条件,当前事务也无法看到,这种情况被称为“幻读”(Phantom Reads)。序列化(Serializable):
这是最高的事务隔离级别,它不仅能避免脏读、不可重复读,而且能解决幻读问题。在序列化级别下,事务仿佛被串行执行,即使多个事务同时执行,效果也如同一个个事务按照某一顺序串行执行一样,但代价是并发性能可能会降低。
解决幻读的方法通常是使用数据库系统提供的机制,例如在可重复读隔离级别下,MySQL的InnoDB存储引擎通过Next-Key Locks(行锁加上间隙锁)来解决幻读问题。在序列化隔离级别下,数据库系统可能会更加严格地锁定数据,确保事务之间没有冲突,从而避免幻读现象。在某些情况下,开发者也可以通过应用程序逻辑配合乐观锁或悲观锁等并发控制机制来处理幻读问题。
mysql中有哪些锁?
行级锁, 表级锁