Category:数据库’

事务计数器和事务嵌套

 - by Hector
1.计数方法
事务计数器从0开始,没嵌套一个事务,事务计数器+1,COMMIT一个事务计数器-1.
注意:事务保存点属于事务内部,不会对事务计数器产生影响。

下面的示例演示嵌套的 BEGIN 和 COMMIT 语句对 @@TRANCOUNT 变量产生的效果。
[code lang="sql"]
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The COMMIT statement will decrement the transaction count by 1.
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--1
--0
[/code]

2. 事务回滚对事务计数器的影响
当子事务ROLLBACK之后,会直接清零TRANCOUNT,下面的示例演示嵌套的 BEGIN TRAN 和 ROLLBACK 语句对 @@TRANCOUNT 变量产生的效果。
[code lang="sql"]
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The ROLLBACK statement will clear the @@TRANCOUNT variable
-- to 0 because all active transactions will be rolled back.
ROLLBACK
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--0[/code]
3.使用保存点确保事务嵌套时能正确回滚
[code lang="sql"]
begin transaction trn_example

update tableName set fieldName = @value
save transaction stk_savePoint
update tableName2 set fieldName2 = @value2
if @@error<>0
begin
rollback transaction stk_savePoint
commit transaction
return
end
else
begin
if @@rowcount = 0
rollback transaction
end
commit transaction
--如果第二个update出现错误,就返回到第一个update后提交,并且使用return截断后面的语句继续运行
--如果第二个update正确执行,就是更新的行数是0,就回滚整个事务,把第一个update执行的结果也取消
[/code]

事务的脏读,不可重复读,虚读

 - by Hector

基本定义

1.脏读 dirty reads
其他事务读取的值被回滚了。当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
2.不可重复的读 non-repeatable reads
同一事务两次读的结果不一样(数据被修改)。当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
3.虚读 phantom read
同一事务两次取到不同的行。如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。

T-SQL字符串相关函数整理

 - by Hector
1、ASCII()
返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
2、CHAR()
将ASCII 码转换为字符。如果没有输入~ 255 之间的ASCII 码值,CHAR()返回NULL 。
3、LOWER()和UPPER()
LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
4、STR()
把数值型数据转换为字符型数据。
STR ([,length[,]])
length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为,decimal 缺省值为。
当length 或者decimal 为负值时,返回NULL;
当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数小于length ,左边补足空格。

MSSQL转MySQL,Access转MySQL(无乱码)

 - by Hector

可能要用的两个软件是MSSQLToMySQL和db2mysql MSSQLToMySQL: 可以把MSSQL中的表结构复制到MYSQL中,用法很简单,安装后填入相应的MSSQL和MYSQL数据库密码即可。需要注意的是这个软件对中文支持不好,建议转换好之后查看和修改一下其中的乱码。下载地址:MSSQLToMySQL db2mysql: DB2MYSQL是一个可

SQL2000 在流水模式下,事务无法启动

 - by Hector

 在sql2000的企业管理器中,我们经常修改一个字段会提示如下错误“在流水模式下,事务无法启动”。这个错误的原因是sql2000出于对数据库的访问效率,只提取一部分内容,下面的提取工作进入了暂停,托动鼠标的滑块到最后,也就是把所有的数据读取完成。 因此在进行操作的时候下面的数据没有读取完,再修改就会提示“在流水模式下,事务无法启动”的错

sql语句分页代码

 - by Hector

已经将表名,列名,和搜索条件分开,使用时只要将这三个替换一下就可以了。
[code=mysql]
string tablename = "LinkCls"; //表名
string idname = "Cls_ID"; //列id名
string TopNum = ((page - 1) * pa