Mysql笔记-01事务与锁

事务的特性:ACID

1.原子性(A):一个事务开始了,只有事务中的所有语句都执行成功了,提交完成了这才算一个事务,通俗的说就是一部小说从头到尾才算一部小说,分割了就不算一部小说了。(不可分割)
2.一致性(C):就是一种完整性状态转换为另外一种完整性状态,不允许数据库出现新老数据共存的状态。
3.隔离性(I):事务与事务之前是分隔的,通过锁机制来实现的,在下面的例子会表现的很清楚。
4.持久性(D):事务一旦被提交之后,数据就是事务修改后的状态永远不会变化的。即使宕机了,也可以通过磁盘恢复过来。

事务的语法

begin transaction //开始事务
.................      // Sql语句
.................      // Sql语句
commit   //提交
rollback //回滚

简单操作:

show variables like '%commit%'    // 查询当前会话环境变量 
ps:环境变量分为:全局变量(global)和当前会话变量(session),show variables(当前会话变量)

创建一个用户表
![简单用户表](https://img-blog.csdnimg.cn/7469100fcc8e493792405f74f552f397.png#pic_center)

创建两个查询会话框
![](https://img-blog.csdnimg.cn/496b41272bba47a08a4c257f7922a9ff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyq5YWl6Zeo55qE5bCP6I-c6bif,size_20,color_FFFFFF,t_70,g_se,x_16)

set session autocommit = 0   //设置当前会话事务自动提交为OFF 
![关闭其中一个会话的自动提交](https://img-blog.csdnimg.cn/79ea44c130eb46ab88e9c59ebe2cc37d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyq5YWl6Zeo55qE5bCP6I-c6bif,size_20,color_FFFFFF,t_70,g_se,x_16)

start transaction     // 开始事务
insert into user values('tom',10,1)  // 插入一条数据

![在没提交时用另外一个会话框进行查询刚刚插入的数据](https://img-blog.csdnimg.cn/1623e57646fe4da4ad7d5f6acaf40765.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyq5YWl6Zeo55qE5bCP6I-c6bif,size_20,color_FFFFFF,t_70,g_se,x_16)
commit  // 提交
![提交之后再查询](https://img-blog.csdnimg.cn/ed353d45f21644c892758ea428bdbfb5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyq5YWl6Zeo55qE5bCP6I-c6bif,size_20,color_FFFFFF,t_70,g_se,x_16)

通过上面可以知道,事务是相互隔离的,是不知道对方的,只有在提交之后其他事务才可以看到。

锁是保持事务隔离性的必要条件,锁可以保证事务的串行化操作。

锁的类型(这边只说明Innodb锁的类型:个人觉得BDB的锁类型已经不太适合当前时代对数据库的需求了。)
1.共享锁(lock in share mode ):允许多个事务读取同个数据,但是不允许其他事务加排它锁
2.排它锁(for update): 只允许自己更新,mysql的事务会默认给update,insert alter,delete这样一些操作默认加上排它锁。
3.innodb还有两种意向锁(表锁),这是内部自己调用的,就不多描述。

你可能感兴趣的:(mysql—TIP,mysql,数据库,sql)