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_exampleupdate 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 ,左边补足空格。
SQL2005出现sql.cab找不到
- by Hector
安装所需的 CAB 文件‘Sql.cab’ 已损坏,不能使用。这可能表示网络错误、读光盘错误或此软件包错误。
网上说法一大堆,真没有发现哪个能解决问题的。
ResultSet can not re-read row data for column X完美解决方法
- by Hector
当使用JDBC 通过 Microsoft SQL Server 2000/2005 Driver for JDBC 检索 ResultSet 对象可能会报如下错误: Java.sql.SQLException: [Microsoft] [SQL Server 2000 JDBC Driver] ResultSet can not re-read row data for column
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