昆山住房和城乡建设部网站网站建设调查分析
昆山住房和城乡建设部网站,网站建设调查分析,深圳网站建设者,如何建立一个免费网站1. 什么是事务#xff1f;
数据库中的事务是指对数据库执行一批操作#xff0c;而这些操作最终要么全部执行成功#xff0c;要么全部失败#xff0c;不会存在部分成功的情况。这个时候就需要用到事务。
最经典的例子就是转账#xff0c;你要给朋友小白转 1000 块钱…1. 什么是事务
数据库中的事务是指对数据库执行一批操作而这些操作最终要么全部执行成功要么全部失败不会存在部分成功的情况。这个时候就需要用到事务。
最经典的例子就是转账你要给朋友小白转 1000 块钱而此时你的银行卡只有 1000 块钱。
转账过程具体到程序里会有一系列的操作比如查询余额、做加减法、更新余额等这些操作必须保证是一体的不然等程序查完之后还没做减法之前你这 1000 块钱完全可以借着这个时间差再查一次然后再给另外一个朋友转账如果银行这么整不就乱了么这时就要用到“事务”这个概念了。
简单来说事务就是要保证一组数据库操作要么全部成功要么全部失败。
2.事务的几个特性(ACID)
ACIDAtomicity、Consistency、Isolation、Durability即原子性、一致性、隔离性、持久性。
原子性(Atomicity)
事务的整个过程如原子操作一样最终要么全部成功或者全部失败这个原子性是从最终结果来看的从最终结果来看这个过程是不可分割的。
一致性(Consistency) 一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。
所谓一致性指的是数据处于一种有意义的状态这种状态是语义上的而不是语法上的。最常见的例子是转帐。例如从帐户A转一笔钱到帐户B上如果帐户A上的钱减少了而帐户B上的钱却没有增加那么我们认为此时数据处于不一致的状态。
隔离性(Isolation) 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的并发执行的各个事务之间不能互相干扰。
持久性(Durability) 一个事务一旦提交他对数据库中数据的改变就应该是永久性的。当事务提交之后数据会持久化到硬盘修改是永久性的。
3.如何开启事务 事务分为隐式事务和显式事务。
隐式事务
mysql中事务默认是隐式事务执行insert、update、delete操作的时候数据库自动开启事务、提交或回滚事务。
是否开启隐式事务是由变量autocommit控制的。
mysql show variables like autocommit;
----------------------
| Variable_name | Value |
----------------------
| autocommit | ON |
----------------------
1 row in set (0.01 sec)--autocommit为ON表示开启了自动提交
显式事务
显式启动事务语句 begin 或 start transaction。配套的提交语句是 commit回滚语句是 rollback。set autocommit0这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句这个事务就启动了而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句或者断开连接。 建议你总是使用 set autocommit1, 通过显式语句的方式来启动事务。
mysql begin;
Query OK, 0 rows affected (0.00 sec)mysql update test set namesss where id7;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql commit;
Query OK, 0 rows affected (0.01 sec)
4.隔离级别
当数据库上有多个事务同时执行的时候就可能出现脏读dirty read、不可重复读non-repeatable read、幻读phantom read的问题。
1脏读一个事务读到另外一个事务没有提交的数据
解释例如两个并发的事务a和b其中事务A查完数据库中的一条记录后事务a继续修改了一条记录此时事务A并未提交此时并发事务b读取了事务a修改的记录这就导致事务b读取到事务a未提交的数据
2不可重复读一个事务先后读取同一条记录但是两次读取的数据不同
解释例如两个并发事务a和b其中事务a读取数据库中的一条记录后事务b对数据库的这条记录进行修改后提交事务b此时事务a继续读取这条记录发现和上次读取的数据不一样
3幻读一个事务按照条件查询数据没有对应的数据行准备插入数据时发现这行数据存在
解释例如两个并发事务a和事务b其中事务a读取了id1的数据时发现没有这条记录然后事务b插入id1的数据并且提交了事务b此时事务a准备插入id1的数据时发现已经存在这条数据因为插入数据时报错显示有这条记录
不可重复读关注是其他事务修改数据并提交了事务前后两次读取到的数据不一致的问题幻读是新插入的行或删除行导致出现的问题。
解决不可重复读的问题只需锁住满足条件的行解决幻读需要锁表。
为了解决这些问题就有了“隔离级别”的概念。
mysql中一共有4中隔离级别其中可重复读是默认级别。
读未提交是指一个事务还没提交时它做的变更就能被别的事务看到。读提交是指一个事务提交之后它做的变更才会被其他事务看到。可重复读是指一个事务执行过程中看到的数据总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下未提交变更对其他事务也是不可见的。串行化顾名思义是对于同一行记录“写”会加“写锁”“读”会加“读锁”。当出现读写锁冲突的时候后访问的事务必须等前一个事务执行完成才能继续执行。 上面4中隔离级别越来越强会导致数据库的并发性也越来越低。 --查看隔离级别两条任一条都行这是查询当前会话的
show variables like transaction_isolation;
select transaction_isolation;--查看全局隔离级别
SELECT GLOBAL.TRANSACTION_ISOLATION;--设置隔离级别
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }--MySQL的session和global一般使用在终端用来对配置进行暂时设置当数据库服务重启就会失效。session和global体现在新的设置生效的范围。
--session当前会话也就是当前连接立即生效。
--global全局不包含当前连接之后新获取的连接都会生效。
5.隔离级别的演示 每个隔离级别可能出现的问题如下 读未提交级别
出现脏读 读已提交级别
解决脏读出现不可重复读问题。
步骤5更新数据后还未提交到步骤6查看数据没有改变说明读已提交解决了脏读问题。
而步骤6和步骤8查看的数据是不一致的这个就出现了不可重复读问题。(在同一个事务先后读取同一条记录但是两次读取的数据不同)。 可重复读级别
解决不可重复读问题出现幻读。
解决了不可重复读问题步骤3,6,8读到的数据都是一致的。在步骤9提交后步骤10读到的数据就是更新后的数据。 出现幻读。
步骤3查看是没有id7的行步骤4中插入id7的行步骤4是隐性提交步骤5中再次查看还是没有。之后步骤7插入数据出现错误。这就是出现了幻读。幻读是针对新插入的行的。
步骤8提交后步骤9中查看可以看到另一事务插入的id7的数据了。 可串行化级别
解决所有问题但也是性能最差的一个。
步骤5中会一直被卡住等到超时。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90268.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!