数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。即只有当事务中的所有的操作都正常执行时,整个事务才提交给数据库。
1、事务是一组SQL语句的执行,要么全部执行成功,要么全部执行失败,不能出现部分成功和失败,保证原子操作
2、事务中所有的数据执行成功,才能提交(commit)事务,把结果写入磁盘
3、事务在执行过程中,有的SQL出现了错误,那么事务必须回滚(rollback)到最初的状态
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。
因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
事务处理隔离级别使用不当,会引起以下问题:
脏读(Drity Dead):一个事务读物了另一个事务未提交的数据
例:当事务A和事务B并发执行时,当事务A更新后,事务B读取到事务A尚未提交的数据,此时事务A回滚,则事务B读取到则是无效的脏数据
(事务B读取到事务A尚未提交的数据)
不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读取到不同的数据
例:当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作并更改事务读到的数据,此时事务B再次去读该数据,发现前后两次读取的数 据不一致(事务B读取事务A已提交的数据)
幻读(Phantom Read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同
例:当事务A和事务B并发执行时,当事务B插叙读取数据后,事务A新增或者删除了一条满足事务B查询要求的数据,此时事务B再次去读数据,发现查询到 的前一次不存在的记录,或者查询的数据不见了(事务B读取到了事务A新增或者删除的数据)
MySQL中存在的隔离级别:
1、Transaction_Read_UNcommitted:未提交读
说明在提交前一个事务可以看到另一个事务的变化,会有脏读,不可重复读,虚读都会存在
2、Transaction_Read_committed:已提交读
说明在提交之前的数据其他事务是不允许看到。不可重复读和虚读的问题还是会存在
3、Transaction_Repeatable_Read:可重复读
保证能够再次读取相同的数据而不会失败。虚读还是会存在
4、Transaction_Serializable:可序列化/串行化
是最高的事务隔离级别,他能够防止脏读、不可重复读、幻读的问题
隔离级别 | 脏读 | 不可重复读 | 幻读
-------------------------------------
未提交读 | 可以 | 可以 | 可以
-------------------------------------
已提交读 | 不可以 | 可以 | 可以
-------------------------------------
可重复读 | 不可以 | 不可以 | 可以
-------------------------------------
串性化 | 不可以 | 不可以 | 不可以
MySQL中事务处理的SQL:
查看事务是方式自动提交
select @@autocommit;
0 表示事务是手动提交,1表示事务自动提交(默认是自动提交)
![事务与锁第1张](https://img2018.cnblogs.com/i-beta/1649057/201912/1649057-20191209162308305-1785233825.png)
设置事务提交的方法:0 表示事务是手动提交,1表示事务自动提交
![事务与锁第2张](https://img2018.cnblogs.com/i-beta/1649057/201912/1649057-20191209162514200-1078031066.png)
begin:开启事务
commit:提交一个事务
rollback:回滚事务到初始状态;
![事务与锁第3张](https://img2018.cnblogs.com/i-beta/1649057/201912/1649057-20191209164042498-1758558213.png)
commit命令提交之后。其他线程才能读到数据库更新之后的数据。
rollback to t1; 回滚到t1的保存点
----------------------------------------------------------------------
种类 | 锁机制 | B-树索引 | 哈希索引 |外键 |事务 | 索引缓存 | 数据缓存
----------------------------------------------------------------------
MYISAM| 表锁 | 支持 | 不支持 |不支持 |不支持 | 支持 | 不支持
----------------------------------------------------------------------
INNODB| 行锁 | 支持 | 不支持 |支持 |支持 | 支持 | 支持
----------------------------------------------------------------------
memory| 表锁 | 支持 | 支持 |不支持 | 不支持| 支持 | 支持
----------------------------------------------------------------------
show engines;
数据库支持的存储引擎:
mysql> show enginesG;
*************************** 1. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
![事务与锁第5张](https://img2018.cnblogs.com/i-beta/1649057/201912/1649057-20191209165349794-2028918563.png)
create table table_name( 属性名 类型...) engine = innodb;
alter table table_name engine = innodb;
window 中是my.ini 在Linux系统中是my.cof
D:mysqlmysql-5.7.24-winx64(我自己电脑的存储位置)
![事务与锁第6张](https://img2018.cnblogs.com/i-beta/1649057/201912/1649057-20191209165552039-1701723758.png)
MYISAM存储存储引擎支持表锁,不支持事务处理,不支持外键
MYISAM并发比较简单,只支持表锁粒度,锁的粒度比较大
并发能力,但是不会引起死锁,它支持表共享的读锁和表互斥的写锁
对同一张表的写操作
对MYISAM表的写操作,则会阻塞其他用户对同一个表的读和写操作
MYISAM的读与写之间互斥,写与写之间互斥,读与读之间共享
INNODB行锁:
INNODB支持事务,支持外键,重要的是支持行级锁(同时支持行锁和表锁,默认使用行锁),并发程度高
INNODB实现两种类型的行锁:
共享锁(S):允许一个事务去读一行,阻止其他的事务获取相同的数据集的排他锁。
排它锁(X):允许获得排他锁的事务更新数据,阻止其他事务获取相同数据集的共享读锁和排他写锁
表锁和行锁的特点:
表锁:开销小、加锁块、不会出现死锁、锁粒度比较大、发生锁冲突的概率是比较高的,并发程度低
行锁:开销大,加锁慢,会出现死锁,锁粒度比较小,发生锁的冲突概率比较小,并发程度高
行锁:INNODB中行锁是通过给索引上的索引项加锁实现的,而不是给表中的行记录加锁
意味着,如果表中的行不存在索引,INNODB使用表锁