mysql 트랜잭션 처리에 대한 요약:
1. 트랜잭션이란 무엇입니까?
MySQL 트랜잭션은 주로 대규모 작업과 복잡성이 높은 데이터를 처리하는 데 사용됩니다.
예를 들어 인사관리 시스템에서 사람을 삭제하면 그 사람의 기본 정보도 삭제해야 하고, 편지함, 글 등 그 사람과 관련된
정보도 삭제해야 합니다. , 이러한 데이터베이스 작업 문은 트랜잭션을 구성합니다!
2. 트랜잭션 사용 조건
MySQL에서 트랜잭션을 사용하려면 MySQL에서 트랜잭션을 지원하는 스토리지 엔진의 지원이 필요합니다. > 및 NDB
cluster
,InnoDB
、NDB
cluster
,
第三方的存储引擎有PBXT
和XtrDB
.
3、事务有什么特点
3-1、原子性
一个事务必须被作为一个不可分割的最小工作单元,每个事务中的所有操作必须要么成功,或者要么失败,
永远不可能一些操作失败,一些操作成功,这就是所谓的原子性的概念.
3-2、一致性
一致性就像上面举的一个例子一样,当发生异常情况下,数据仍然是正确的.就是说当一个事务执行失败了,
数据之间是不会受异常的情况而影响,永远保持着他的正确性.
3-3、隔离性
当一个事务还未提交,每个事务之间是相互隔离的,互不受到影响.
3-4、持久性
当一个事务进行提交之后,发生的变化就会永远保存在数据库中.
4、事务的隔离级别
4-1、未提交读
一个事务中对数据所做的修改,即使没有提交,这个修改对其他的事务仍是可见的,这种情况下就容易出现脏读,影响了数据的完整性.
4-2、读提交
一个事务开始时,只能看见其他已经提交过的事务.这种情况下容易出现不可重复读(两次读的结果不一样).
4-3、可重复读
多次读取记录的结果都是一致的,可重复读可以解决上面的不可重复读的情况.但是有这样一种情况,
当一个事务在读取某个范围的记录时,另外一个事务在这个范围内插入了一条新的数据,当事务再次进行读取数据时,
发现比第一次读取记录多了一条,这就是所谓的幻读,两次读取的结果不一致.
4-4、可串行
串行就像一个队列一个样,每个事务都是排队等候着执行,只有前一个事务提交之后,下一个事务才能进行操作.
这种情况虽然可以解决上面的幻读,但是他会在每一条数据上加一个锁,容易导致大量的锁超时和锁竞争,
特别不适用在一些高并发的业务场景下.
4-5、隔离性总结
通过上面的举例,我们不难发现.脏读和不可重复读重在更新数据,然后幻读重在插入数据.
5、多种存储引擎时事务的处理方式
根据上面事务使用的条件,我们可以得知有的存储引擎是不支持事务的,例如MyISAM
存储引擎就不支持.
那如果在一个事务中使用了事务性的存储引擎和非事务性的存储,提交是可以正常进行,
但是回滚非事务性的存储引擎则会显示响应的错误信息,具体信息和存储引擎有关.
6、如何使用事务
MySQL中事务隐式开启的,也就是说,一个sql语句就是一个事务,当sql语句执行完毕,事务就提交了.在演示的过程中,我们显式开启.
7、mysql的自动提交
上面提到了MySQL中事务是隐式开启的,则代表我们每一个sql是自动提交的,需要关闭则需要设置autocommit
PBXT
및 XtrDB
가 포함됩니다.3. 트랜잭션의 특징은 무엇입니까
트랜잭션은 분할할 수 없는 최소 작업 단위로 간주되어야 합니다. 각 트랜잭션의 모든 작업은 성공하거나 실패해야 합니다.
🎜일부에게는 불가능합니다. 🎜🎜🎜3-2. 일관성 🎜🎜🎜일관성은 예외가 발생해도 여전히 정확합니다. 즉, 트랜잭션 실행이 실패하더라도🎜🎜데이터는 비정상적인 상황에 영향을 받지 않고 항상 정확성을 유지합니다.🎜🎜🎜3-3. 트랜잭션이 아직 완료되지 않은 경우 🎜🎜🎜3-4. 내구성 🎜🎜🎜트랜잭션이 제출되면 변경 사항이 데이터베이스에 영원히 저장됩니다. 격리 수준 🎜🎜🎜🎜4-1. 커밋되지 않은 읽기🎜🎜🎜한 트랜잭션의 데이터 수정 사항은 커밋되지 않더라도 다른 트랜잭션에서 계속 볼 수 있습니다. 데이터 무결성이 보장됩니다. 🎜🎜🎜4-2. 읽기 제출 🎜🎜🎜트랜잭션이 시작되면 제출된 다른 트랜잭션만 볼 수 있습니다. 이 경우 반복 불가능한 읽기가 발생하기 쉽습니다. 두 번 읽은 결과가 다름).🎜🎜🎜4-3.반복 읽기🎜🎜🎜기록을 여러 번 읽은 결과는 일관됩니다. 그런데 위와 같은 반복 읽기가 불가능한 상황이 있습니다. 상황🎜🎜트랜잭션이 특정 범위의 레코드를 읽을 때 다른 트랜잭션이 이 범위에 새로운 데이터를 삽입하는 경우, 트랜잭션이 해당 데이터를 다시 읽을 때 처음보다 레코드가 하나 더 있음을 발견합니다. 이것은 소위 팬텀 읽기(phantom read)입니다. 🎜🎜🎜4-4. 직렬화 가능 🎜🎜🎜Serial은 대기열에 있고 실행을 기다리고 있습니다. 이전 트랜잭션 제출 후 다음 트랜잭션이 실행될 수 있습니다. 🎜🎜이 상황은 위의 팬텀 읽기를 해결할 수 있지만 각 데이터에 잠금을 추가하므로 많은 잠금 시간 초과 및 잠금 경쟁이 쉽게 발생할 수 있습니다. 🎜🎜은 특히 동시성이 높은 일부 비즈니스 시나리오에서는 적용되지 않습니다. 🎜🎜🎜4-5. 격리 요약🎜🎜🎜위의 예를 통해 더티 읽기와 반복 불가능한 읽기가 데이터 업데이트에 중점을 두고 있다는 것을 쉽게 알 수 있습니다. .🎜🎜🎜5. 여러 스토리지 엔진으로 트랜잭션을 처리하는 방법🎜🎜🎜위의 트랜잭션 사용 조건에 따르면MyISAM과 같은 일부 스토리지 엔진은 트랜잭션을 지원하지 않음을 알 수 있습니다.
스토리지 엔진은 지원하지 않습니다.🎜🎜트랜잭션 스토리지 엔진과 비트랜잭션 스토리지를 함께 사용하면 커밋은 정상적으로 진행될 수 있지만🎜🎜비트랜잭션 스토리지 엔진을 롤백하면 응답이 표시됩니다. 오류 메시지, 특정 정보는 스토리지 엔진과 관련됩니다. 🎜🎜🎜 6. 트랜잭션 사용 방법 🎜🎜🎜 MySQL의 트랜잭션은 암시적으로 활성화됩니다. 즉, sql 문이 실행되면 트랜잭션입니다. , 트랜잭션이 제출되었습니다. 시연 중에 우리는 이를 명시적으로 활성화했습니다. 🎜🎜🎜7. MySQL 자동 제출 🎜🎜🎜위에서 언급했듯이 MySQL의 트랜잭션은 암시적으로 활성화됩니다. 즉, 각 SQL이 자동으로 제출됩니다. 꺼야 하고, autocommit
옵션을 설정해야 합니다.🎜🎜🎜8. 트랜잭션의 격리 수준을 설정합니다🎜🎜set session transaction isolation level 隔离级别;
위 내용은 데이터베이스 트랜잭션 처리에 관한 몇 가지 문제 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!