当前位置:Gxlcms > 数据库问题 > MySQL事务

MySQL事务

时间:2021-07-01 10:21:17 帮助过:2人阅读

一个支持事务的存储引擎或者关系型数据库必然满足ACID测试

A:atomicity,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚

C:consistency, 一致性;数据库总是从一个一致性状态转换为另一个一致性状态

I:Isolation,隔离性;一个事务所做出的操作在提交之前,是不能为其它所见;隔离有多种隔离级别

D:durability: 持久性;一旦事务提交,其所做的修改会永久保存于数据库中

 

事务生命周期:启动事务START TRANSACTION-->执行sql语句-->结束事务:(1) COMMIT:提交  或者  (2) ROLLBACK: 回

注意:只有事务型存储引擎方能支持此类操作

 

技术分享

 

autocommit                  | ON     每条sql语句当作一个事务自动提交(这会影响系统i/o性能)

建议:显式请求和提交事务,而不要使用“自动提交”功能  set autocommit=0

 

事务支持savepoint

  SAVEPOINT identifier    例如:savepoint sp1  savepoint sp2

  ROLLBACK [WORK] TO [SAVEPOINT] identifier    例如:rollback to sp2

  RELEASE SAVEPOINT identifier    例如:release savepoint sp1

  

事务隔离级别:

  READ UNCOMMITTED (读未提交): 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)

 

  READ COMMITTED (读提交): 本事务读取到的是其他事务提交后的最新数据。问题是在同一个事务里,如果其他事务修改两次当前事务前后两次相同的SELECT会读到不同的结果(不重复读)

 

  REPEATABLE READ (可重读):在同一个事务里,SELECT的结果是事务开始时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象

 

  SERIALIZABILE (可串行化):一个事务未提交时,另一个事务对同一数据做操作时会被阻塞

 

存在的问题:脏读(另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据)

      不可重复读(解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致)

      幻读(解决了不可重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)但是如果另一个事务同时提交了新数据例如30改为40,这时在底层看到同一数据有30和40两个值)

      加锁读:当在高并发时,可能会导致一场噩梦,不过最大限度地提高了数据的安全性

 

查看隔离级别:

技术分享

 

死锁:两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,解决死锁主要针对于最常用的InnoDB

 

查看事务日志:

技术分享

innodb_log_buffer_size   缓存中事务日志的大小

innodb_log_file_size        磁盘事务日志文件大小

innodb_log_files_in_group   几个事务日志文件

innodb_log_group_home_dir     事务日志文件存放位置

事务日志文件名:

技术分享

以上几个参数不支持运行时修改,需要修改配置文件并从新启动

MySQL事务

标签:

人气教程排行