mysql事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql事务相关的知识,希望对你有一定的参考价值。

技术图片

事务的概念

事务是一种机制,一个操作序列,包含了一组数据库操作命令,并且把所有命令作为一个整体一起想系统提交或撤销操作请求,
即这一组数据库命令要么都执行,要么都不执行,事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,
事务是最小的控制单元,事务适用于用户同时操作数据库系统的场景,如银行,保险公司
以及证券交易系统等,通过事务的整体以保证数据的一致性,事务是保证了一组操作的平稳性和可预测性的技术。

事务的四大特性(ACID)

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

原子性(Atomicity

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性(Isolation

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

持久性(Durability

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,
即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

事务的隔离级别(默认事务级别为可重复读)

总的说,数据库事务无非就两种:读取事务(select)、修改事务(update,insert)。在没有事务隔离控制的时候,多个事务在同一时刻对同一数据的操作可能就会影响到最终期望的结果,通常有四种情况:
(1) 两个更新事务同时修改一条数据时,很显然这种情况是最严重的了,程序中无论如何也不能出现这种情况,因为它会造成更新的丢失!
(2) 一个更新事务更新一条数据时,另一个读取事务读取了还没提交的更新,这种情况下会出现读取到脏数据。
(3) 一个读取事务读取一条数据时,另一个更新事务修改了这条数据,这时就会出现不可重现的读取。
(4)一个读取事务读取时,另一个插入事务(注意此处时插入)插入了一条新数据,这样就可能多读出一条数据,出现幻读。
以上四种情况描述完毕,相信大家也发现规律了,前三种是对同一条数据的并发操作,对程序的结果可能产生致命影响,尤其是金融等实时性,准确性要求极高的系统,绝不容许这三中情况的出现,
相比第四种情况不会影响数据的真实性,在很多情况下是允许的,如社交论坛等实时性要求不高的系统!
综上四个情况,我们可以大致这样简单的理解(最初说的两种事务的自由组合2*2=4):
A) 修改时允许修改(丢失更新)
B) 修改时允许读取(脏读)
C) 读取时允许修改(不可重复读)
D) 读取时允许插入(幻读)
从上到下问题越来越不严重,但所需的性能开销却越大。因为不同的系统允许不同级别的情况,所以就出现了事务隔离这么一个东东,来允许我们设定数据库的并发行为。

总结下如果不考虑事务的隔离性,会发生的几种问题:

脏读
  脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
  当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B)
update account set money=money - 100 where name=’A’;
  当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

不可重复读
  不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
  例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
  不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

虚读(幻读)
  幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
  幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

mysql数据库的四种事务隔离级别

Read Uncommitted(读取未提交内容)

   在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read);

Read Committed(读取提交内容

   这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果;

Repeatable Read(可重读)

   这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
   简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
   InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

Serializable(可串行化)

   这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
     这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

     脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
     不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
     幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

Mysql操作事务

默认情况下Mysql的事务是自动提交的,之前我们用SQL操作数据库时,一条数据执行后
系统胡自动执行事务提交。当需要一组语句作为一个事务提交时,需要手动对事务进行控制。
手动控制事务有两种方法,一种是使用事务处理命令控制,另一种是使用set设置事务的处理方式
使用事务命令控制事务(3个命令)
begin:表示开始一个事务,后面会有多条数据库操作语句执行
commit:表示提交一个事务,对应前面的begin操作,它们之间的数据库操作语句一起完成
rollback:表示回滚一个事务,再begin和commit之间,如果某一个数据库的操作语句出现错误
执行rollback回滚,数据库回到begin之前的状态,也就是操作语句都没执行。

前面我们了解了原理,下面我们开始实验

mysql操作事务命令实验

这是之前的数据表
mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
+----+----------+----------+-----+
2 rows in set (0.01 sec)

mysql> insert into info (name,address,age) values (‘wangwu‘,‘hangzhou‘,30);
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;  #查看数据表的数据之后,发现默认是自动提交的
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

mysql> begin; #开始事务
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values (‘zhaoliu‘,‘hangzhou‘,31); #我们再加一条操作命令,数据
Query OK, 1 row affected (0.00 sec)

mysql> savepoint a; #我们打上一个标记a,下次我们可以回滚到标记a
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values (‘tianqi‘,‘hangzhou‘,33); #我们再加一条数据
Query OK, 1 row affected (0.00 sec)

mysql> savepoint b; #打上标记b
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values (‘heipa‘,‘hangzhou‘,35); #再加一条数据
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
|  5 | tianqi   | hangzhou |  33 |
|  6 | heipa    | hangzhou |  35 |

我们再开一台终端去查看info数据表中有没有数据

[root@localhost ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 8
Server version: 5.7.20 Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘h‘ for help. Type ‘c‘ to clear the current input statement.

mysql> use schol;
ERROR 1049 (42000): Unknown database ‘schol‘
mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> 
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| hob              |
| info             |
| user             |
| view_user        |
+------------------+
4 rows in set (0.00 sec)

mysql> select * from info; #发现没有数据,我们创建的事务只是存放在内存中,并没有真实写到硬盘中,提交事务才行
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

回滚到b没有添加heiba的时候

mysql> rollback to b;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
|  5 | tianqi   | hangzhou |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

回滚到a的没有tianqi的时候

mysql> rollback to a;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

回滚到最初的时候

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

这时候我们在回滚到b,错误,之前我们的已经存放在内存的已经释放掉了,就回不去了

mysql> rollback to b;
ERROR 1305 (42000): SAVEPOINT b does not exist

#我们再插一行数据进去,再试试回滚。
mysql> insert into info (name,address,age) values (‘zhaoliu‘,‘hangzhou‘,31);
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

我们以另一个终端为基准,我们发现zhaoliu这行数据被写进去了

我们只要执行rollback,而不是回滚到一个节点,都视为提交事务了

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

我们回到第一个终端再插一行数据进去

mysql> insert into info (name,address,age) values (‘tianqi‘,‘hangzhou‘,33);
Query OK, 1 row affected (0.00 sec)

mysql> commit; #提交事务
Query OK, 0 rows affected (0.00 sec)

到另一台终端去查看以下,提交事务也行

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
|  8 | tianqi   | hangzhou |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

关闭自动提交

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> update info set address=‘beijing‘ where name=‘tianqi‘; #把tianqi的address修改成beijing
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

再到另一终端验证是不是没有修改

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
|  8 | tianqi   | hangzhou |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

我们回到第一台终端开启自动提交

mysql> set autocommit=1;
Query OK, 0 rows affected (0.01 sec)

再到另一台终端验证是不是修改了

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
|  8 | tianqi   | beijing  |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

存储引擎

存储引擎概念介绍

?MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧,锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
?存储引擎就是MySQL将数据存储在文件系统中的存储方式或存储格式
?目前MySQL常用的两种存储引擎:
??MyISQM
??InnoDB
?MySQL存储引擎是MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作
?使用特殊存储引擎的主要优点之一在于,仅需提供特殊应用所需的特性,数据库中的系统开销较小,具有更有效和更高的数据库性能
?MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输存储引擎,之后按照各个存储引擎的存储格式进行存储

技术图片

MyISQM的介绍

ISAM的特点:
ISAM执行读取操作的速度很快
而且不占用大量的内存和存储资源
他不支持事务处理
不能够容错
MyISAM的特点:
不支持事务
表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞
●会在数据写入的过程阻塞用户数据的读取
●也会在数据读取的过程中阻塞用户的数据写入
可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘IO的压力
●但缓存只会缓存索引文件,不会缓存数据
采用MyISAM存储引擎数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM存储引擎它不支持外键约束,只支持全文索引
每个MyISAM在磁盘.上存储成三个文件,每- -个文件的名字以表的名字开始,扩展名指出文件类型
MyISAM在磁盘.上存储的文件

●.frm文件存储表定义

●数据文件的扩展名为.MYD (MYData)
●索引文件的扩展名是.MYI (MYIndex)
MyISAM适用的生产场景举例
公司业务不需要事务的支持
一般单方面读取数据比较多的业务,或单方面写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差

InnoDB特点介绍

支持事务:支持4个事务隔离级别
行级锁定,但是全表扫描仍然会是表级锁定
读写阻塞与事务隔离级别相关
具有非常高效的缓存特性:能缓存索引,也能缓存数据
表与主键以簇的方式存储
支持分区、表空间,类似oracle数据库
支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
对硬件资源要求还是比较高的场合
InnoDB适用生产场景分析
业务需要事务的支持
行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
业务数据更新较为频繁的场景,如:论坛,微博等
业务数据一致性要求较高,例如:银行业务
硬件设备内存较大,利用Innodb较好的缓存能力来提高内存利用率,减少磁盘I0的压力
企业选择存储引擎依据
需要考虑每个存储引擎提供了那些不同的核心功能及应运场景
支持的字段和数据类型
所有引擎都支持通用的数据类型
但不是所有的引擎都支持其他的字段类型,如二进制对象
锁定类型:不同的存储引擎支持不同级别的锁定
表锁定
行锁定

索引的支持

建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能
不同的存储引擎提供不同的制作索引的技术
有些存储引擎根本不支持索引
事务处理的支持
事务处理功能通过提供在向表中更新和插入信息期间的可靠性
课根据企业业务是否支持事务选项选择存储引擎
配置存储引擎
在企业中选择好合适的存储引擎之后,就可以进行修改了

修改步骤

查看数据库可配置的存储引擎
查看表正在使用的存储引擎
配置存储引擎为所选择的类型
使用show engines查看系统支持的存储引擎
方法1:
show table status from  库名  where  name=‘表名;
方法2:
show create table    表名;
修改存储引擎
方法1: alter table修改;
alter table table_ name engine=引擎;
方法2:修改my.cnf,指定默认存储引擎并重启服务
default-storage-engine=InnDB
方法3: create table创建表时指定存储引擎
create table   表名   (字段) engine=   引擎
方法4: Mysql_ convert_ table_ format 转化存储引擎
Mysql_ convert_ table_ format -user=root -password=密码
- sock=/tmp/mysql.sock - engine =引擎 库名 表名

存储引擎的实验

mysql> show engines; #查看系统默认的存储引擎
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

mysql> show create table info; #查看info这张表,存储引擎是默认InnoDB
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info  | CREATE TABLE "info" (
  "id" int(4) NOT NULL AUTO_INCREMENT,
  "name" varchar(10) NOT NULL,
  "address" varchar(50) DEFAULT ‘nanjing‘,
  "age" int(3) NOT NULL,
  PRIMARY KEY ("id"),
  UNIQUE KEY "index_name" ("name"),
  FULLTEXT KEY "full_addr" ("address")
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> quit
Bye

想以后创建的每一张表都是MyISAM存储引擎,就到配置文件里改。

[root@localhost ~]# vim /etc/my.cnf  #进入数据库主配置文件

default-storage-engine=Myisam  #添加Myisam的存储引擎
[root@localhost ~]# mysql -u root -p 进入数据库
mysql> use school; #进入school数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table a ( id int );  #创建a数据表
Query OK, 0 rows affected (0.00 sec)
mysql> show create table a;  #查看a数据表,发现存储引擎变成了MyISAM
+-------+-------------------------------------------------------------------------------------+
| Table | Create Table                                                                        |
+-------+-------------------------------------------------------------------------------------+
| a     | CREATE TABLE "a" (
  "id" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

想让单个的表是某种存储引擎就直接改

mysql> alter table a engine=innodb;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table a;
+-------+-------------------------------------------------------------------------------------+
| Table | Create Table                                                                        |
+-------+-------------------------------------------------------------------------------------+
| a     | CREATE TABLE "a" (
  "id" int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

以上就是我们全部的内容,谢谢收看

以上是关于mysql事务的主要内容,如果未能解决你的问题,请参考以下文章

基础-事务

理解片段事务期间片段的生命周期方法调用

提交带有全屏片段的片段事务

使用 OnItemClickListener 列出视图片段到片段事务

Android中的片段事务问题

Android从后台堆栈中删除事务