MySQL事务:一组原子性的SQL查询,或者说一个独立工作单元
一个支持事务的存储引擎或者关系型数据库必然满足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 事务日志文件存放位置
事务日志文件名:
以上几个参数不支持运行时修改,需要修改配置文件并从新启动