事务与死锁
事务
事务是数据库管理系统执行过程中的一个逻辑单位,由一个或多个SQL语句组成,目的是确保数据的完整性和一致性。事务具有ACID四个特性:
- 原子性(Atomicity):事务内的所有操作要么全部成功,要么全部失败,不允许部分成功的情况。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性(Isolation):并发执行的事务之间不会互相干扰,即使它们同时操作同一个数据项。
- 持久性(Durability):一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障也不会丢失。
TCL(Transaction Control Language)
TCL是事务控制语言,用于控制事务的开始、提交和回滚:
- BEGIN:开启一个事务。
- COMMIT:提交事务,将事务中的所有修改永久保存到数据库中。
- ROLLBACK:回滚事务,撤销事务中所有的修改,使数据库回到事务开始前的状态。
死锁
死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,这些事务都将无法向前推进。常见的死锁原因包括:
- 两个事务分别锁定了一部分资源,然后又试图请求对方锁定的资源。
- 锁的顺序不一致。
解决死锁的方法包括:
- 使用超时机制。
- 顺序加锁。
- 死锁检测与回滚。
锁
数据库中的锁用于控制对共享资源的访问,以避免数据的不一致性和冲突。常见的锁包括:
- 行级锁:锁定数据表中的某一行。
- 表级锁:锁定整个数据表。
- 乐观锁:通过版本号或时间戳来控制数据的并发访问,避免直接锁定资源。
- 悲观锁:假定会发生冲突,直接锁定数据资源。
分布式事务
分布式事务涉及多个数据库系统或资源管理器,需要保证这些系统之间的事务一致性和完整性。常见的分布式事务处理协议包括两阶段提交(2PC)和三阶段提交(3PC)。
函数、过程、索引
函数
函数是SQL中的一种对象,用于执行特定的操作并返回一个值。函数可以分为内置函数和自定义函数:
- 内置函数:如
CONCAT()
,LCASE()
,UCASE()
,NOW()
,ROUND()
等,用于执行常见的字符串、日期、数值等操作。 - 自定义函数:用户根据需要定义的函数,可以封装复杂的逻辑和计算。
字符串:concat() 拼接 concat(字段一,`任意字符` 字段二) t from 表名;
lcase()转小写
ucase()转大写
quote()加引号
ltrim()截左边的空格
trim()截去空格
rtrim()截右边的空格
lpad() 填充
rpad()
substring 截取指定长度
char_lengh() 字符长度
md5() 消息摘要(散列值)
sha2() 安全哈希算法替代了
uuid() 全局唯一标识
uuid_short()
日期和时间
- now()
- sysdate()
- curdate()
- curtime()
- unix_timestamp() 基于1970/1/1日起算
- year()
- mounth
- day()
- date_format() 日期格式化
- time_format() 时间格式化
- adddate() 加上天数
- datediff() 两个日期的差
### 数值函数
- round() 四舍五入
- truncate 直接截断,不做四舍五入;
- floor() 向下取整
- CEIL() 向上取整
select round(3.1435,2), round(3.7,2);
select truncate(3.1,0),truncate(3.7,0);
select floor(3.1),floor(3.7);
select floor(3.1),CEIL(3.7);
索引
索引是数据库中用于提高查询效率的一种数据结构,它相当于数据表的目录,可以快速地定位到表中的数据。常见的索引类型包括:
- 主键索引:唯一标识表中的每一行数据。
- 唯一索引:保证索引列的值唯一。
- 普通索引:最基本的索引类型,没有唯一性约束。
- 全文索引:用于对文本内容进行全文搜索。
过程
过程(存储过程)是一组为了完成特定功能的SQL语句集,它存储在数据库中,通过指定存储过程的名字并给它传递参数(如果该存储过程需要参数)来执行它。存储过程可以封装复杂的业务逻辑,提高代码的重用性和安全性。
总结
事务、死锁、锁、函数、过程和索引是数据库管理系统中非常重要的概念,它们共同确保了数据的完整性、一致性和高效性。在实际应用中,需要根据具体的需求和场景来合理使用这些概念和技术。