今天针对MySQL中的事务和数据库备份相关内容展开了学习学习内容如下1.事务一组逻辑操作单元使数据从一种状态切换到另一种状态事务处理的原则保证所有事务都作为一个工作单元来执行即使出现了故障都不能改变这种执行方式。当在一个事务中执行多个操作时要么所有的事务都被提交(commit)那么这些修改就永久地保存下来要么数据库管理系统将放弃所作的所有修改整个事务回滚(rollback)到最初状态。2.事务的ACID特性原子性atomicity事务中的操作要不全部执行成功要不全部执行失败一致性consistency执行事务前后数据会从一个合法状态切换到另一个合法状态这种状态是语义上的不是语法上的隔离性isolation一个事务的执行不能被其他事务干扰持久性durability持久性是指一个事务一旦被提交它对数据库中数据的改变就是永久性的接下来的其他操作和数据库故障不应该对其有任何影响。3.事务的状态活动的部分提交的失败的终止的提交的4.处理事务事务分为显式事务和隐式事务显式事务的语法mysql BEGIN; #或者 mysql START TRANSACTION;START TRANSACTION相比于BEGIN后面可以加几个限制的关键字① READ ONLY 标识当前事务是一个只读事务 也就是属于该事务的数据库操作只能读取数据而不能修改数据。注意 只读事务中只是不允许修改那些其他事务也能访问到的表中的数据对于临时表来说我们使用CREATE TMEPORARY TABLE创建的表)由于它们只能在当前会话中可见所以只读事务其实也是可以对临时表进行增、删、改操作的。② READ WRITE 标识当前事务是一个读写事务 也就是属于该事务的数据库操作既可以读取数据也可以修改数据。结束事务可用COMMIT提交也可以使用ROLL BACK回滚到事务执行前此外还可以设置存档点SAVEPOINT 存档点名之后使用ROLL BACK回退到指定的SAVEPOINT中删除存档点使用release SAVE POINT 存档点名隐式事务MySQL中有一个系统变量用于控制是否开启隐式事务autocommit可使用SHOW VARIABLES LIKE autocommit;查看并且可以设置它的状态补充: Oracle默认不自动提交需要手写COMMIT命令而 MySQL 默认自动提交。数据库对象指的就是数据库、表、视图、存储过程等结构。当我们使用CREATE、ALTER、DROP等语句去修改数据库对象时就会隐式的提交前边语句所属于的事务。即:BEGIN SELECT ...... # 事务中的一条语句 UPDATE ...... # 事务中的一条语句 ... ... # 事务中的其他语句 CREATE TABLE ...#此语句会隐式的提交前边语句所属于的事务当我们在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时会隐式的提交上一个事务。5.事务的隔离级别READ UNCOMMITTED读未提交在该隔离级别所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。READ COMMITTED读已提交它满足了隔离的简单定义一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别但不是MySQL默认的。可以避免脏读但不可重复读、幻读问题仍然存在。REPEATABLE READ可重复读事务A在读到一条数据之后此时事务B对该数据进行了修改并提交那么事务A再读该数据读到的还是原来的内容。可以避免脏读、不可重复读但幻读问题仍然存在。这是MySQL的默认隔离级别。SERIALIZABLE可串行化确保事务可以从一个表中读取相同的行。在这个事务持续期间禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免但性能十分低下。能避免脏读、不可重复读和幻读。6.数据并发问题1脏写如果事务A修改了事务B修改过的数据那么就发生了脏写2脏读如果事务A读取到了事务B已经修改但是还没提交的数据如果说事务B回滚那么事务A读取到的数据就是无效的3不可重复读事务A读取数据后事务B修改了这段数据并提交事务A再读值就不同了这就是不可重复读4幻读事务A读取一段数据之后事务B向其中加入了新的数据并提交事务A再读同一个表会发现多了几行这就发生了幻读设置事务的隔离级别SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别; #其中隔离级别格式 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE或者SET [GLOBAL|SESSION] TRANSACTION_ISOLATION 隔离级别 #其中隔离级别格式 READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE6.数据库的备份#备份一个数据库 mysqldump –u 用户名称 –h 主机名称 –p密码 待备份的数据库名称[tbname, [tbname...]] 备份文件名 称.sql #备份全部数据库 mysqldump -uroot -pxxxxxx --all-databases all_database.sql mysqldump -uroot -pxxxxxx -A all_database.sql #备份部分数据库 mysqldump –u user –h host –p --databases [数据库的名称1 [数据库的名称2...]] 备份文件名 称.sql mysqldump –u user –h host –p 数据库的名称 [表名1 [表名2...]] 备份文件名称.sql