1. MySQL事务
1.1 事务简介
事服务器托管网务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有 一条SQL出现异常,整个操作就会回滚,整个业务执行失败。
MySQL 中事务分为手动提交事务和自动提交事务。
1.2 手动提交事务语法
start transaction; 或者 begin; -- 开始事务
commit; -- 提交事务
rollback; -- 事务回滚
1.3 自动提交事务
Mysql默认每一条DML语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务。
-- 取消自动提交,以验证MySQL的自动提交事务
show variables like 'autocommit'; -- 查看自动提交是否打开 on / off
set @@autocommit=off; -- 关闭自动提交方式
-- 关闭自动提交后,会发现插入数据后,需要commit才能写入数据库。
1.4 事务的四大特性ACID
特性 |
含义 |
原子性 |
每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功, 要么都 失败。 |
一致性 |
事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的 总金额 是 2000,转账后 2 个人总金额也是 2000。 |
隔离性 |
事务与事务之间不应该相互影响,执行时保持隔离的状态. |
持久性 |
一旦事务执行成功,对数据库的修改是持久的。就算关机,数据也是要保存下来的. |
2. 使用事务可能导致的问题
1、脏读:当一个事务A还未提交时,他做的变更服务器托管网被其他事务B看到,如果事务A发生了回滚,那么其所形成的数据在逻辑上是不存在的,那么事务B拿到的就是脏数据
2、不可重复读:当事务A进行一次读取后,事务B执行也对相关数据进行了操作,事务A再次读,读到的数据可能就与第一次读到的逻辑上存在矛盾,这就是不可重复读。
3、幻读 :指的是读到的数据与数据库中的数据不一致,比如事务A读了一行数据,这是事务B将这行数据删除了,之后事务A想对这行数据进行修改,发现无法成功。在事务A的视角:我刚才明明读到了数据,现在却无法操作,就像是出现了幻觉。这种现象在可重复读模式下更容易出现,因为事务A的视角别定格到了开启事务的那一刻。
3. 事务隔离级别
隔离级别就是为解决上述问题而服务的。
1、读未提交(RU):当一个事务还未提交时,他做的变更被其他事务看到 (什么问题都解决不了)
2、读已提交(RC):一个事务已经提交,其他事务才能看到他的变更。(只解决了脏读) 【Oracle默认】
3、可重复读(RR):一个事务在执行过程中看到的数据,总是事务开始时数据库中数据的样子。(保证了同一事务中两次读是一致的,解决了不可重复读和脏读,同时也加重了幻读。)【MySQL默认】
4、串行化(SR):对同一行记录,写会加写锁,读会加读锁,当发生锁冲突时,后执行的事务要等前面执行的事务执行完成后才能执行。(解决了所有的问题,性能也是最差的)
4. 理解
可见,若隔离级别不设置为串行化,使用了事务依然会存在并发问题。
所以,==事务的本质作用是一颗后悔药==,==它可以解决并发问题,但他的解决思路并不是阻止错误的发生,而是提供一个错误发生后后悔的机会==。
当然它还可以解决一些程序错误造成问题。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
方式一: bool isALLSa服务器托管网meCount = item.DetailItems.GroupBy(a => a.SportsName).Count()==1;//判断集合体育项是否全部相同 方式二:bool isALLSameCount…